假设我有一个这样的数组:
Array
(
[Start] => Array
(
[Item 1] => Array
(
[0] => Item 1_1
[Item 2_1] => Array
(
[Item 2_1_1] => x
)
[1] => Item 3_1
)
[0] => Item 2
[1] => Item 3
)
)
是否有一个php函数可以用来获取导致我的数组中值x
的路径,这意味着,在这种情况下结果将是:
Start, Item 1, Item 2_1, Item 2_1_1, x
答案 0 :(得分:2)
我目前唯一能想到的方法是将大量嵌套foreach ($array as $key => $value)
循环与array_search()
一起使用。
虽然设计它是一个递归的设计会更好,所以使用一个函数是明智的。
function recursiveSearch($key, $array)
{
foreach ($array as $k => $ar) {
if (is_array('x', $ar)) {
return $k . ', ' . array_search('x', $ar);
} else {
if ($ar === 'x') {
return $k
} else {
return recursiveSearch($key, $ar);
}
}
}
}
只需要接受它,不一定有效或类似。
答案 1 :(得分:1)
您遇到的问题涉及递归和/或树遍历。 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
的{{1}}。要启用树遍历,它将包含在$array
中。这是以递归方式将RecursiveIteratorIterator
- 迭代器与$it
一起使用所必需的。
然后在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";
}
正如您所看到的,它会根据您感兴趣的价值进行过滤。
您可能感兴趣的其他相关问题是: