我有一個嵌套到未知/無限深度的多維數組。 我希望能夠遍歷每個元素。 我不想用,foreach(){foreach(){foreach(){}}}
因爲我不知道深度。多維數組嵌套到無限深度
我最終尋找所有名爲「xyz
」的嵌套數組。有沒有人有任何建議?
我有一個嵌套到未知/無限深度的多維數組。 我希望能夠遍歷每個元素。 我不想用,foreach(){foreach(){foreach(){}}}
因爲我不知道深度。多維數組嵌套到無限深度
我最終尋找所有名爲「xyz
」的嵌套數組。有沒有人有任何建議?
使用上面的評論,我已經找到了答案:
function findXyz($array){
foreach($array as $foo=>$bar){
if (is_array($bar)){
if ($bar["xyz"]){
echo "<br />The array of xyz has now been found";
print_r($bar['xyz']);
}else{
findXyz($bar);
}
}
}
}
findXyz($myarray);
這遍歷所有嵌套的數組,並查找誰擁有XYZ的子陣列,按我原來的任何元素請求。 array_walk_array和RecursiveIteratorIterator無法實現這一點。
遞歸。
編寫一個走一個數組的函數;對於每個也是數組的元素,它會調用它自己;否則,當它找到目標字符串時,它會返回。
你有沒有想過爲此使用array_walk_recursive?
另一(更慢)的方法將是flatten the array第一執行搜索之前,即:
$myarray = array('a','b',array(array(array('x'),'y','z')),array(array('p')));
function array_flatten($array,$return)
{
for($x = 0; $x <= count($array); $x++)
{
if(is_array($array[$x]))
{
$return = array_flatten($array[$x],$return);
}
else
{
if($array[$x])
{
$return[] = $array[$x];
}
}
}
return $return;
}
$res = array_flatten($myarray,array());
或者,對於遞歸搜索,看here中的示例:
function arrayRecursiveSearch($needle, $haystack, $path=""){
if(!is_array($haystack)){
die("second argument is not array");
}
global $matches;
foreach($haystack as $key=>$value)
{
if(preg_match("/$needle/i", $key)){
$matches[] = array($path . "$key/", "KEY: $key");
}
if(is_array($value)){
$path .= "$key/";
arrayRecursiveSearch($needle, $value, $path);
unset($path);
}else{
if(preg_match("/$needle/i", $value)){
$matches[] = array($path . "$key/", "VALUE: $value");
}
}
}
return $matches;
}
$arr = array("Asia"=>array('rambutan','duku'),
"Australia"=>array('pear','kiwi'),
"Arab"=>array('kurma'));
print_r(arrayRecursiveSearch("ra",$arr));
array_walk_recursive可以很好地工作,除了PHP.net文檔中的這個小句子:「您可能會注意到'sweet'這個鍵從不顯示。任何包含數組的鍵都不會傳遞給該函數。「 – stevenmc 2010-11-30 10:27:28
有一個浩浩蕩蕩區別未知和無限。但是,您可以使用SPL Iterators而不是使用多個嵌套的foreach
循環。
實施例:
$array_obj = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
foreach($array_obj as $key => $value) {
echo $value;
}
看一看到RecursiveIteratorIterator接口。
$interface = new RecursiveIteratorIterator(new RecursiveArrayIterator($your_array));
foreach($interface as $k=>$v) { /* your function*/ }
我最終尋找所有名爲「xyz」的嵌套數組。有沒有人有任何建議?
當然。在使用一些迭代器的建議的基礎上,你可以這樣做:
$iterator = new RecursiveIteratorIterator(
new RecursiveArrayIterator($array),
RecursiveIteratorIterator::SELF_FIRST
);
foreach ($iterator as $key => $item) {
if (is_array($item) && $key === 'xyz') {
echo "Found xyz: ";
var_dump($item);
}
}
其他答案之間的重要區別這是正在被使用的RecursiveIteratorIterator::SELF_FIRST
標誌,使非葉(即父母)項目(即數組)在迭代時可見。
你也可以圍繞數組迭代器使用ParentIterator
,而不是檢查循環中的數組,以使後者更整潔一些。
這個遞歸函數將需要使用或foreach – Thariama 2010-11-30 10:05:55
是的,但只有一次。不具有硬編碼的嵌套級別。 – tdammers 2010-11-30 10:06:37