PHP多维数组键成一个单独的数组?

时间:2012-06-03 02:38:19

标签: php arrays key

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

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

...谢谢

4 个答案:

答案 0 :(得分: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()(或类似函数)来访问元素。顺便说一句,我没有尝试过这段代码,我只是写了它来说明一点。我打赌你可以让它上班!

答案 1 :(得分: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标志以获得良好的度量,尽管在这种情况下不需要(所有子数组至少有一个元素的情况)。事实上,对于这种情况,没有旗帜会更有效率。

答案 2 :(得分:1)

我不确定我完全理解你的问题。如果要在一维数组中存储多维键,则需要某种方法对它们进行编码。然后你可以走完整个"深的"结构和每个叶节点将编码的密钥添加到列表中。

如果您只想复制数组,则基本相同。您需要遍历数组,随意构建副本,或使用深层复制功能,如Deep copy of PHP array of references中所讨论的

您可能缺少的部分是多维数组只是一个数组数组。 oreilly's php book

中的好东西

答案 3 :(得分: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);