3

を含む配列がある場合、ループやeval()を使用せず['key1', 'key2', 'key3']にこれを配列にマップする方法はありますか?$array['key1']['key2']['key3']

配列の例:

$var = [
    'key1' => [
        'subkey1' => [
            'finalkey' => 'value',
        ],
        'subkey' => [
            'otherkey' => 'value',
        ],
    ],
    'key2' => 'blah'
];

そして、私はこのような配列を持っています:

$keys = ['key1', 'subkey1', 'finalkey'] 

また

$keys = ['key1', 'subkey']
4

3 に答える 3

5
function array_find($needle, &$haystack)
{
    $current = array_shift($needle);
    if(!isset($haystack[$current]))
    {
        return null;
    }
    if(!is_array($haystack[$current]))
    {
        return $haystack[$current];
    }
    return array_find($needle, $haystack[$current]);
}
于 2012-07-03T23:17:31.750 に答える
2

テストされていない、別の質問に対する同様の回答から来ています。

function get_value($dest, $path)
{
  # allow for string paths of a/b/c
  if (!is_array($path)) $path = explode('/', $path);

  $a = $dest;
  foreach ($path as $p)
  {
    if (!is_array($a)) return null;
    $a = $a[$p];
  }

  return $a;
}

これは、再帰的なソリューションよりも優れたパフォーマンスを発揮するはずです。

于 2012-07-03T23:20:32.430 に答える
2

私は自分の個人的なフレームワークのために次の非再帰的な方法を思いついた:

function Value($data, $key = null, $default = false)
{
    if (isset($key) === true)
    {
        if (is_array($key) !== true)
        {
            $key = explode('.', $key);
        }

        foreach ((array) $key as $value)
        {
            $data = (is_object($data) === true) ? get_object_vars($data) : $data;

            if ((is_array($data) !== true) || (array_key_exists($value, $data) !== true))
            {
                return $default;
            }

            $data = $data[$value];
        }
    }

    return $data;
}

使用法:

var_dump(Value($array, 'key1.subkey1.finalkey')); // or
var_dump(Value($array, array('key1', 'subkey1', 'finalkey')));

オブジェクトとデフォルト値のサポート、およびその他のチェックを削除することで、さらに簡略化できます。

于 2012-07-04T01:16:10.680 に答える