2013-10-09 61 views
0

我有一个函数,它可以在一个多维数组中搜索一个键,并将数组内的路径 作为字符串返回给我所需的键。在字符串中传递位置作为字符串

有没有什么办法可以在php中使用这个字符串来达到我原来的数组中的这个位置,而不是去达到这个值,而是改变这个数组的特定的bracnch?

一个例子:

$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'; 

感谢

+0

我已经阅读了两次,但没有成功,以了解您的问题。 –

+1

所以你想搜索'“desired_key”的示例数组并返回,'first_level => second_level => desired_key'?然后你想要另一个函数来使用该字符串版本来获取该键的值?为什么在第一个函数可以直接返回值时执行两个过程? – SmokeyPHP

+0

实际上所有这一切的重点是什么? – Brewal

回答

1

采取这一

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; 
} 

如果密钥路径是安全的(例如,不是由用户给出),你可以使用eval,做一些事情,如:

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

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

var_dump($key); 
+0

pNre,感谢您阅读我的困难措辞并理解我的意思。 – Skarlinski

-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)); 
} 
+0

你在哪里看到java的问题? – Brewal

+0

LMAO。这使我的一天 – Prashank

+0

哇,我以为我有一个糟糕的一天前我的咖啡..... –

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]); 

} 
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); 

当然,它会如果路径中的所有键已经存在才能正常工作。否则,它会将新的子数组添加到错误的地方。