您遇到的問題涉及遞歸和/或樹遍歷。 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