【问题标题】:PHP: Iterating through array?PHP:遍历数组?
【发布时间】:2011-03-06 19:21:24
【问题描述】:
  • 我想要一个函数 搜索我的数组,并且 返回所有 子节点到特定节点。什么是 最合适的方法是什么? 在这种情况下是否需要递归?

我之前已经构建了一些非常复杂的函数,它们在有或没有递归的帮助下通过多维数组进行迭代并重新排列它们,但是这个问题让我完全陷入困境,我无法理解它...

这是我的数组:

Array
(
    [1] => Array (
            [id] => 1
            [parent] => 0

        )

    [2] => Array (
            [id] => 2
            [parent] => 1
        )

    [3] => Array (
            [id] => 3
            [parent] => 2
        )
)

更新:

我想要得到的输出。对不起这个不好的例子,但我会把它归咎于缺乏关于如何格式化我需要做的东西的知识:)

function getAllChildren($id) {
    // Psuedocode
    return $array;
}

getAllChildren(1); // Outputs the following:

Array
(
    [2] => Array (
            [id] => 2
            [parent] => 1
        )

    [3] => Array (
            [id] => 3
            [parent] => 2
        )
)

【问题讨论】:

    标签: php arrays recursion multidimensional-array


    【解决方案1】:
    <?php
    function searchItem($needle)
    {
        foreach ($data as $key => $item)
        {
            if ($item['id'] == $needle)
            {
                return $key;
            }
        }
        return null;
    }
    ?>
    

    【讨论】:

    • 您好,谢谢!不过我怕你误会了我。我需要子节点到特定的“id”
    • 我不明白。可以举个例子吗?
    • 更新了原帖。感谢您的关注:)
    【解决方案2】:

    查看 PHP 中的 array_walk_recursive() 函数:

    http://www.php.net/manual/en/function.array-walk-recursive.php

    【讨论】:

      【解决方案3】:
      $nodes = array( 1   => array (  'id'        => 1,
                                      'parent'    => 0
                                   ),
                      2   => array ( 'id'         => 2,
                                     'parent'     => 1
                                   ),
                      3   => array ( 'id'         => 3,
                                     'parent'     => 2
                                   )
                      );
      
      
      function searchItem($needle,$haystack) {
          $nodes = array();
          foreach ($haystack as $key => $item) {
              if ($item['parent'] == $needle) {
                  $nodes[$key] = $item;
                  $nodes = $nodes + searchItem($item['id'],$haystack);
              }
          }
          return $nodes;
      }
      
      
      $result = searchItem('1',$nodes);
      echo '<pre>';
      var_dump($result);
      echo '</pre>';
      

      searchItem() 函数的非递归版本:

      function searchItem($needle,$haystack) {
          $nodes = array();
          foreach ($haystack as $key => $item) {
              if (($item['parent'] == $needle) || array_key_exists($item['parent'],$nodes)) {
                  $nodes[$key] = $item;
              }
          }
          return $nodes;
      }
      

      (假设父/子的顺序,因此子节点不包含在数组中,除非父节点已经存在)

      【讨论】:

      • 嗨,马克!谢谢你的帮助!您将如何修改它以能够处理查找多级儿童的问题?
      • 解释一下,如果我在顶部节点上的示例中的数组上运行函数,我希望返回节点 2 和 3,因为它们都是顶部节点的子节点,但在多个级别上。
      • 嗨,马克,非常感谢您的更新。它就像一个魅力!
      • 它使用与我的代码中所示相同的初始数组生成与第一个(递归)函数相同的结果,但如果在其父数组中定义子元素,则不会返回正确的结果
      • @Industrial 我删除了我的帖子。虽然您可以使用 SPL 做到这一点,但它确实使您的用例变得过于复杂。马克的解决方案很好。 保持简单.
      猜你喜欢
      • 2013-05-23
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      • 2011-05-23
      • 2012-11-14
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多