【问题标题】:PHP multi dimensional array keys into one single array?PHP多维数组键为一个数组?
【发布时间】:2012-06-03 02:38:19
【问题描述】:

我在 PHP 中有一个多维数组。它可以具有任意数量的级别,因为它是动态生成的。数组中包含的所有数组都不是空的,并且都设置了键。

我正在寻找一种将所有数组键放入新数组的方法。我知道如何在单层数组上执行此操作,但我被困住了,因为我不知道数组将进入多少层,它可能是单层数组本身还是 20 层多维数组?

谢谢...

【问题讨论】:

  • 引用数组的键呢?是否应将它们包含在结果集中?
  • 在这种情况下你想使用recursion。
  • 你想要只是钥匙吗?还是“id”类型的键,即top_key 和一个孩子top_key-next_key 等等?
  • @mjhennig 是的,我想要数组中的每个键,但我并不担心相同的键会相互覆盖。
  • @Jon 只是数组中的所有键,例如 array('key1', 'key2' ....)

标签: php arrays key


【解决方案1】:

对于这个特定的应用程序,我会使用类而不是数组。我这么说的原因是处理多个级别会容易得多,因为您可以在类中使用递归函数来访问它。这是我所说的一个一般示例:

class Node {
    public $children = array();
    public $key;

    public function get_element_by_key($search_key){
        if($this->key == $search_key) return $this;
        foreach ($this->children as &$child) {
            if($child->get_element_by_key($search_key) != NULL){
                return $child;
            }
            else return NULL;
        }
    }
}

您还可以添加函数来添加元素,构造函数来创建元素并添加到父元素等等。然后你会使用函数get_element_by_key()(或类似的)来访问元素。顺便说一句,我没有尝试过这段代码,我只是为了说明一点而写的。不过我打赌你可以让它工作!

【讨论】:

    【解决方案2】:
    $ritit = new RecursiveIteratorIterator(new RecursiveArrayIterator($myArray), RecursiveIteratorIterator::SELF_FIRST);
    $keys = array();
    foreach ($ritit as $leafValue) {
        foreach (range(0, $ritit->getDepth()) as $depth) {
            $keys[] = $ritit->getSubIterator($depth)->key();
        }
    }
    print_r(array_unique($keys));
    

    我添加了 RecursiveIteratorIterator::SELF_FIRST 标志以作为很好的衡量标准,尽管在这种情况下不需要它(所有子数组至少有一个元素的情况)。事实上,对于这种情况,没有标志会更有效。

    【讨论】:

      【解决方案3】:

      如果您想将所有键作为新数组的 值 收集,则以下内容应该适合您。

      // Function to recursively gather keys
      function getKeys(&$keyArray, $parentArray) {
          if (!is_array($parentArray) || count($parrentArray) === 0) {
              return;
          }
          foreach ($parentArray as $key => $element) {
              $keyArray[] = $key;
              if (is_array($element)) {
                  getKeys($keyArray, $element);
              }
          }
      }
      
      // Usage
      $arrayToBeChecked = array(array(array(...
      $arrayToHoldKeys;
      getKeys($arrayToHoldKeys, $arrayToBeChecked);
      

      【讨论】:

      • 是的,这就是我要找的。我是新人,我可以用一门课或其他什么来做,但在我眼里最好是通过引用传递谢谢:)
      • 很高兴听到。但请务必牢记这些类,人们确实使用它们是有原因的。另外,如果这是您的“答案”,我将不胜感激!
      【解决方案4】:

      我不确定我是否完全理解你的问题。如果你想将多维键存储在一个单维数组中,你需要一些方法来对它们进行编码。然后,您可以遍历整个“深层”结构,并为每个叶节点将编码的键添加到列表中。

      如果你只想复制数组,基本上同样适用。您需要遍历数组,随时构建副本,或使用深复制功能,例如在Deep copy of PHP array of references 中讨论的@

      您可能缺少的部分是多维数组只是数组的数组。好东西在oreilly's php book

      【讨论】:

        猜你喜欢
        • 2011-09-20
        • 1970-01-01
        • 2019-10-08
        • 2021-11-28
        • 2022-01-03
        • 1970-01-01
        • 1970-01-01
        • 2013-09-21
        • 2014-12-11
        相关资源
        最近更新 更多