0

多次元配列でキーを検索し、配列内のパスを目的のキーに文字列として返す関数があります。

この文字列をphpで使用して、元の配列のこの場所に到達し、値を取得するのではなく、配列のこの特定の枝に変更を加える方法はありますか?

例:

$array = array('first_level'=>array(
                   'second_level'=>array(
                          'desired_key'=>'value')));

この例では、関数は次の文字列を返します。

'first_level=>second_level=>desired_key'

この出力を使用する方法、または次のような方法で使用するために別の形式にする方法はありますか?

$res = find_deep_key($array,'needle');
$array[$res]['newkey'] = 'injected value';

ありがとう

4

5 に答える 5

1

キー パスが安全な場合 (たとえば、ユーザーによって指定されていない場合)、次のevalようなものを使用して実行できます。

$k = 'first_level=>second_level=>desired_key';
$k = explode('=>', $k);
$keys = '[\'' . implode('\'][\'', $k) . '\']';

eval('$key = &$array' . $keys . ';');

var_dump($key);
于 2013-10-09T14:00:42.737 に答える
0

キーの配列で再帰的な検索をしたいと思いますか? 私が間違っている場合は修正してください。

これを試して

function recursive_array_search($needle,$haystack) {
   foreach($haystack as $key=>$value) {
      $current_key=$key;
      if($needle===$value OR (is_array($value) && recursive_array_search($needle,$value) !== false)) {
        return $current_key;
      }
   }
return false;
}

ここから取得 http://in3.php.net/manual/en/function.array-search.php#91365

于 2013-10-09T13:48:49.920 に答える
0

いくつかの新しいサブ配列を多次元の複雑な配列に追加する必要があり、正確に追加する必要がある場所がわかっている場合 (パスを文字列として持っている場合)、これは機能する可能性があります (を使用しない別のアプローチeval()):

function append_to_subarray_by_path($newkey, $newvalue, $path, $pathDelimiter, &$array) {
    $destinationArray = &$array;
    foreach (explode($pathDelimiter, $path) as $key) {
        if (isset($destinationArray[$key])) {
            $destinationArray = &$destinationArray[$key];
        } else {
            $destinationArray[$newkey] = $newvalue;
        }
    }
}   

$res = find_deep_key($array,'needle');
append_to_subarray_by_path('newkey', 'injected value', $res, '=>', $array);

もちろん、パス内のすべてのキーが既に存在する場合にのみ機能します。そうしないと、新しいサブ配列が間違った場所に追加されます。

于 2018-02-22T10:34:25.277 に答える
0

次のようなものが必要です:

find_key_in_array($key, $array, function($foundValue){

  // do stuff here with found value, e.g.
  return $foundValue * 2;

});

実装は次のようになります。

function find_key_in_array($key, $array, $callback){

  // iterate over array fields recursively till you find desired field, then:
  ...
  $array[$key] = $callback($array[$key]);

}
于 2013-10-09T14:02:33.947 に答える
-1

文字列と配列を取る関数を書くだけです。この関数は、各配列レベルのキーを受け取り、見つかったオブジェクトを返します。

そのような:

void object FindArray(Array[] array,String key)
{
if(key.Length == 0) return array;

var currentKey = key.Split('=>')[0];
return FindArray(array[currentKey], key.Remove(currentKey));
}
于 2013-10-09T13:38:33.490 に答える