2011-10-13 138 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; 
}