2011-10-13 189 views
0

假設我有一個多維數組結構:php。走多維陣列?

array(parent) 
    array 
    array 
    array(parent) 
     array(parent) 
      ...some key I'm looking for.... 
     array 
    array 
array 
array 
array 
array 
array 

我遍歷它遞歸地發現,包含了一些關鍵的我正在尋找一個陣列 - 這是沒有問題的。

但是,然後我需要走上樹,並添加額外的關鍵所有父母(父母標記)。我無法把頭圍住它。我可以輕鬆地遞歸地走下樹,但我無法弄清楚如何走路。有人能指引我走向正確的方向嗎?

+0

如果你只有一個「子」元素的引用,沒有辦法從中得到它的「父」元素除非直到達到孩子在整個結構遞歸迭代。也許你應該使用樹狀數據結構,比如PEAR中的[Tree](http://pear.php.net/package/Tree)? –

+0

嗯。也許我應該確實:)讓我們看看社區中的其他人是否有任何補充。 – Stann

回答

3

這是我剛剛寫只是爲了得到這個想法的例子。

注意這會在第一次出現匹配值時中斷執行。

codepad link

$arr = array(
    array('a','b','c','d'), 
    array(61,62,63,64,65), 
    array('e','f','g','h'), 
    array(6,7,8,9), 
    array(1,2,array(1,2,3,4,5,6,7,8),4,5,6,7,8), 
    array('i','j','k','l','m'), 
); 

function array_walkup($desired_value, array $array, array $keys=array()) { 
    if (in_array($desired_value, $array)) { 
     array_push($keys, array_search($desired_value, $array)); 
     return $keys; 
    } 
    foreach($array as $key => $value) { 
     if (is_array($value)) { 
      $k = $keys; 
      $k[] = $key; 
      if ($find = array_walkup($desired_value, $value, $k)) { 
       return $find; 
      } 
     } 
    } 
    return false; 
} 

$keys = array_walkup(3, $arr); 

echo "3 has been found in \$arr[".implode('][', $keys)."]"; 
+0

作品。謝啦。 – Stann

1

您可以使用這些方針的東西的一類:

private $valueFound; 

public function recurse($item) 
{ 
    if ($item['special_field'] === 'value you are looking for') 
    { 
     $this->valueFound = $item['other_field']; 
     return; 
    } 

    if (isset($item['child']) 
    { 
     recurse($item['child']); 
    } 

    // Use tail-recursion. 
    // You are at this point past all recursion and are heading back up the tree. 
    $item['field_to_set'] = $this->valueFound; 
}