get all array keys by value
假设我有一个这样的数组:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
)
是否有一个 php 函数可用于获取指向数组中值
1 | Start, Item 1, Item 2_1, Item 2_1_1, x |
您遇到的问题涉及递归和/或树遍历。 PHP 支持使用
对数组进行树遍历
要获取所有父数组的所有key,需要从第一层到当前深度获取key。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
在本例中,首先创建带有
然后,在
但如果它确实匹配递归迭代器上的
该示例执行以下输出:
1 | Start, Item 1, Item 2_1, Item 2_1_1, x |
与您在问题中的描述相符。
因为这些是迭代器,您也可以将其实现到它自己的类中。下面的 然后它更易于使用(并且可能也适用于其他场景)。所以首先是一些基本的用法示例。遍历数组显示每个值的所有键。实例化数组的迭代器并输出每个值的键: 这将创建以下输出: 在您的场景中,您还希望根据特定值(此处为字符串 这里是输出:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
* 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;
}
}
2
3
4
5
foreach ($it as $value) {
echo implode(', ', $it->getKeys()), ', ', $value,"\
";
}
2
3
4
5
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
2
3
4
5
6
$filter = new RegexIterator($it, '~^x$~');
foreach ($filter as $value) {
echo implode(', ', $it->getKeys()), ', ', $value,"\
";
}
如您所见,它会根据您感兴趣的值进行过滤。
您可能感兴趣的其他相关问题是:
- RecursiveIteratorIterator 在 php 中是如何工作的
- PHP - 从面包屑列表的多维关联数组返回父数组
- 以相反的顺序从单向数组中获取数据
我目前能想到的唯一方法是大量嵌套
将其设计为递归会更好,因此使用函数是明智的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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); } } } } |
只是一个尝试,不一定有效或类似的东西。