您遇到的问题涉及递归和/或树遍历。 PHP支持使用RecursiveArrayIterator
和RecursiveIteratorIterator
的数组遍历树。
要获得所有父数组的所有密钥,您需要从第一级获取当前深度并获取密钥。这由RecursiveIteratorIterator
以及getSubIterator()
方法支持。这不是在手册中确实有据可查的,所以这里是一个例子:
$it = new RecursiveIteratorIterator(
new RecursiveArrayIterator($array)
);
foreach ($it as $value) {
if ($value !== 'x') continue;
$keys = array();
$depth = $it->getDepth();
for ($i = 0; $keys[] = $it->getSubIterator($i)->key(), $depth--; $i++);
echo implode(', ', $keys), ', ', $value, "\n";
}
在这个例子中,首先是RecursiveArrayIterator
与您创建$array
。要启用树遍历,它将被包装到RecursiveIteratorIterator
中。以递归方式使用$it
-finator和foreach
时,这是必需的。
在foreach
的内部,然后根据您的搜索值检查数组值。如果不匹配,则继续下一个值。
但是,如果它确实匹配getDepth()
和getSubIterator()
递归迭代器上的方法用于创建键数组。
的例子做了以下的输出:
Start, Item 1, Item 2_1, Item 2_1_1, x
哪你的描述中的问题相匹配。
因为这些都是迭代器,你也可以实现它到它自己的类。下面Iterator
类不仅允许做树遍历在构造函数中所提供的阵列上,而且有一个名为getKeys()
返回包含从最低级别的所有的键,在当前深度的阵列方法:
/**
* Class ArrayRecursiveKeysIterator
*/
class ArrayRecursiveKeysIterator extends RecursiveIteratorIterator
{
/**
* @param array $array
*/
public function __construct(array $array)
{
parent::__construct(new RecursiveArrayIterator($array));
}
/**
* @return array keys
*/
public function getKeys()
{
for ($k = [], $i = 0, $m = $this->getDepth(); $i <= $m; $i++)
$k[] = $this->getSubIterator($i)->key();
return $k;
}
}
它更容易使用(也可能用于其他场景)。首先介绍一些基本的使用示例。通过数组显示每个值的所有键。实例的迭代器阵列,并且输出每每个值的键:
$it = new ArrayRecursiveKeysIterator($array);
foreach ($it as $value) {
echo implode(', ', $it->getKeys()), ', ', $value, "\n";
}
这产生了以下的输出:
Start, Item 1, 0, Item 1_1
Start, Item 1, Item 2_1, Item 2_1_1, x
Start, Item 1, 1, Item 3_1
Start, 0, Item 2
Start, 1, Item 3
在您的情况您也需要根据特定值过滤迭代器(这里是字符串"x"
),您可以通过使用RegexIterator
这是一个FilterIterator
轻松完成。这便是您的方案:
$it = new ArrayRecursiveKeysIterator($array);
$filter = new RegexIterator($it, '~^x$~');
foreach ($filter as $value) {
echo implode(', ', $it->getKeys()), ', ', $value, "\n";
}
这里输出:
Start, Item 1, Item 2_1, Item 2_1_1, x
正如你所看到的,它被过滤你感兴趣的值
其他相关问题,你“再在可能感兴趣的是:
你可以用'连载尝试()' – fedorqui 2013-02-15 19:57:53
退房图搜索算法,如BFS和DFS。 – 2013-02-15 19:59:04
array_search()? – 2013-02-15 19:59:13