返回嵌套数组的所有键

时间:2015-11-30 16:16:50

标签: php multidimensional-array

给出一个任意深度的嵌套数组,如下所示:

$array = array(
            1400=> 
                array(7300=>
                        array(
                            7301=> array(),
                            7302=> array(),
                            7305=> array(
                                7306=>array()
                            ),
                        ),
                    7314=>array()
                ),
            );

如何获得任何密钥的密钥层次结构。

例如:

getkeys(7305);

应该按顺序返回1400,7300,7305

getkeys(7314);

应返回1400,7314

所有数组键都是唯一值

3 个答案:

答案 0 :(得分:2)

使用RecursiveIteratorIterator

$array = array(
  1400 => array(
    7300 => array(
      7301=> array(),
      7302 => array(),
      7305 => array(
        7306=>array()
      ),
    ),
    7314=>array()
  ),
);

function getKeys($key, $array) {
  $found_path = [];
  $ritit = new RecursiveIteratorIterator(new RecursiveArrayIterator($array), RecursiveIteratorIterator::SELF_FIRST);

  foreach ($ritit as $leafValue) {

    $path = array();
    foreach (range(0, $ritit->getDepth()) as $depth) {
      $path[] = $ritit->getSubIterator($depth)->key();
    }

    if (end($path) == $key) {
      $found_path = $path;
      break;
    }
  }

  return $found_path;
}

print_r(getKeys(7305, $array));
// Array
// (
//     [0] => 1400
//     [1] => 7300
//     [2] => 7305
// )

答案 1 :(得分:1)

想法是检查当前数组分支,如果找不到针键,则迭代当前项并通过递归函数调用检查它们的数组子节点。在每次下降之前,我们将当前键推送到堆栈,如果函数没有在整个分支中找到针键,则弹出堆栈。因此,如果找到密钥,该函数将通过链返回true,从而保留堆栈中的成功密钥。

function branchTraversing(& $branch, & $key_stack, $needle_key) {
  $found = false;
  if (!array_key_exists($needle_key, $branch)) {
    reset($branch);
    while (!$found && (list($key, $next_branch) = each($branch))) {
      if (is_array($next_branch)) {
        array_push($key_stack, $key);
        $found = branchTraversing($next_branch, $key_stack, $needle_key);
        if (!$found) {
          array_pop($key_stack);
        }
      }
    }
  } else {
    array_push($key_stack, $needle_key);
    $found = true;
  }

  return $found;
}

function getPath(& $array, $needle_key) {
  $path = [];
  branchTraversing($array, $path, $needle_key);
  return $path;
}

$test_keys = [1400, 7300, 7302, 7306, 7314, 666];

foreach ($test_keys as $search_key) {
  echo '<p>' . $search_key . ' => [ '
  . implode(', ', getPath($array, $search_key)) . ' ]</p>';
}

答案 2 :(得分:1)

这是一个非常有趣的问题,所以我尝试创建一个能够回显键的函数。如果这还不够好,请告诉我,我可以改进代码。感谢。

<?php

$a = array(
            1400=> 
                array(7300=>
                        array(
                            7301=> array(),
                            7302=> array(),
                            7305=> array(
                                7306=>array()
                            ),
                        ),
                    7314=>array()
                ),
            );

$mykey = 7306;
$level = 0;
$result = array();
$resultarray = test($a,$mykey,$level,$result);

function test($array,$mykey,$level,$result){
    $level++;
    foreach($array as $key => $element){
        if($key == $mykey){
            echo 'found';
            print_r($result);
            exit;
        } else if(is_array($element)){
            $result[$level] = $key;
            $result1 = test($element,$mykey,$level,$result);
        }
    }
}