2

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

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

谢谢...

4

4 回答 4

7

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

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()(或类似功能)来访问元素。顺便说一句,我没有尝试过这段代码,我只是为了说明一点而写的。我打赌你可以让它工作!

于 2012-06-03T02:52:12.543 回答
3
$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很好的标志,尽管在这种情况下不需要它(所有子数组至少有一个元素的情况)。事实上,对于这种情况,没有标志会更有效。

于 2012-06-03T02:58:04.207 回答
1

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

如果您只想复制数组,则基本上同样适用。您需要遍历数组,随时构建副本,或使用深复制函数,例如在PHP 引用数组的深拷贝中讨论的

您可能缺少的部分是多维数组只是一个数组数组。oreilly 的 php 书中的好东西

于 2012-06-03T02:50:50.040 回答
1

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

// 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);
于 2012-06-03T02:56:29.123 回答