2013-10-09 64 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); 

當然,它會如果路徑中的所有鍵已經存在才能正常工作。否則,它會將新的子數組添加到錯誤的地方。