如何在php中扫描嵌套数组?

时间:2015-11-09 18:17:11

标签: php arrays layer

我想知道如何完全循环一个数组(比如使用foreach)以重新排列数据。但是,此数组包含数组,并且这些数组包含数组等。例如:

$data= array(
               'key1' => array(
                   'key2' => 'value2', 
                   'key3' => 'value3'
                ),
                'key4' => array(
                   'key5' => 'value5', 
                   'key6' => 'value6'
                )
           )

在这个例子中,我知道我可以使用两个foreach循环遍历它并执行我需要重新排列数据的操作但在我的情况下我不知道有多少数组嵌套在$data中,因为我没有做到这一点对我来说太大了,只是看看并计算。

3 个答案:

答案 0 :(得分:2)

你在一个函数中编写循环,如果任何一个子节点是一个数组,你可以调用它,如下所示:

function checkArray($array, $value){
    foreach($array as $entry){
        if(is_array($entry)){ 
            checkArray($entry, $value); 
        } else {
            // Do your check and logic here.
        }
    }
}
$example = array( 'key' => array( 'key1' => 'value1', 'key2' => 'value2'), 'key4' => 'value4');
checkArray($example, 'value4');

答案 1 :(得分:2)

您可以使用array_walk_recursive()函数“扫描”数组。此函数将递归到更深的数组中。你将找回一个数组的每个成员。

Source - $server = "MYSRV" ; $user = "username" ; $SrvPath = "E:\Users\$user"
$sb = {
param($User,$SrvPath)
  NET SHARE $User$=$SrvPath "/GRANT:Domain Admins,FULL" "/GRANT:$User,CHANGE" /REMARK:"Home folder for $SrvPath"
  } 

Invoke-Command -Computername "$Server" -ScriptBlock $sb -ArgumentList $user,$SrvPath

答案 2 :(得分:1)

有很多种可能性。

你可以使用递归:

function scan($array) {
    foreach ($array as $item) {
        if (is_array($item) {
            scan($item);
            // ...
        }
        // ...
    }
}

或者如果你想避免递归,你可以在循环中转换递归

function scan($array) {
    $stack = [$array];
    do {
        foreach (array_shift($stack) as $item) {
            if (is_array($item) {
                $stack[] = $item;
            }
            // ...
        }
    } while (count($stack) > 0);
}

或其他不同的东西 - 取决于您的需求