无法从多维数组中循环正确的值

时间:2018-02-19 23:45:21

标签: php arrays for-loop multidimensional-array

我正在尝试了解多维数组,并故意构建以下名为$answerStringArray的数组来练习:

array(4) {
    [0] => array(1) {
        [0] => array(3) {
            [0] => string(8) "Swimming" 
            [1] => string(7) "Burgers" 
            [2] => string(3) "Bob"
        }
    }[1] => array(1) {
        [0] => array(3) {
            [0] => string(7) "Running" 
            [1] => string(5) "Chips" 
            [2] => string(4) "Paul"
        }
    }[2] => array(1) {
        [0] => array(3) {
            [0] => string(7) "Jogging" 
            [1] => string(5) "Salad" 
            [2] => string(5) "David"
        }
    }[3] => array(1) {
        [0] => array(3) {
            [0] => string(7) "Walking" 
            [1] => string(5) "Sauce" 
            [2] => string(5) "Frank"
        }
    }
}

我正在尝试构建一个循环wherby,我可以回显值

Swimming
Running
Jogging 
Walking

在第一次迭代后跟

Burgers
Chips
Salad
Sauce

等等

我很感激我可以写array[0][0][0];来打印游泳等等,但我想了解如何循环以获得所需的数据。

我尝试过使用如下所示的循环,但它开始变得不同步,然后我意识到这可能是一个不好的方法来尝试做我想要的事情:

$arrayLength = count($answerStringArray);

 for($x = 0; $x <= $arrayLength; $x++){

        for ($y =0; $y<=$x; $y++) {

            for ($z =0; $z<=$y; $z++) {

            echo $answerStringArray[$x][$y][$z];

        }

      }
 }

2 个答案:

答案 0 :(得分:1)

  

我很感激我可以写数组[0] [0] [0];打印游泳等等,但我想了解如何循环以获得所需的数据。

这正是你能理解的方式。您只需按照要在屏幕上查看元素的顺序收集数组索引:

Swimming -- [0][0][0]
Running  -- [1][0][0]
Jogging  -- [2][0][0]
Walking  -- [3][0][0]

Burgers  -- [0][0][1]
Chips    -- [1][0][1]
Salad    -- [2][0][1]
Sauce    -- [3][0][1]

Bob      -- [0][0][2]
Paul     -- [1][0][2]
David    -- [2][0][2]
Frank    -- [3][0][2]

然后你可以查看索引并查看模式:要创建组,你必须在第一个索引处循环0 ... 3:

for($x = 0; $x <= 3; $x++){
    echo $answerStringArray[$x][0][0] . "\n";
}                               // ^
echo "\n";
for($x = 0; $x <= 3; $x++){
    echo $answerStringArray[$x][0][1] . "\n";
}                               // ^
echo "\n";
for($x = 0; $x <= 3; $x++){
    echo $answerStringArray[$x][0][2] . "\n";
}                               // ^

然后你可以使用标记的索引,它似乎从0..2开始,每组一步。所以将整个事物包装成一个外循环:

for($z = 0; $z <= 2; $z++){
    for($x = 0; $x <= 3; $x++){
        echo $answerStringArray[$x][0][$z] . "\n";
    }
    echo "\n";
}

然后你可以摆脱硬编码的数字,并在代码开始时使用count()

$xcount = count($answerStringArray);
$zcount = count($answerStringArray[0][0]); // here we assume that all arrays look the same!

for($z = 0; $z < $zcount; $z++){ // "<= maxindex" became the more common "< size"
    for($x = 0; $x < $zcount; $x++){ // also here
        echo $answerStringArray[$x][0][$z] . "\n";
    }
    echo "\n";
}

然后我们可以添加中间索引的用法,并消除额外的换行符(echo "\n";行已经在末尾产生了一个不需要的空行,并且很快引入了$y - 循环在块之间做同样的事情):

$answerStringArray=array(array(array("Swimming" ,"Burgers" ,"Bob"))
                        ,array(array("Running" ,"Chips" ,"Paul"))
                        ,array(array("Jogging" ,"Salad" ,"David"))
                        ,array(array("Walking" ,"Sauce" ,"Frank")));
//var_dump($answerStringArray);

echo "***\n";
$xcount = count($answerStringArray);
$ycount = count($answerStringArray[0]);
$zcount = count($answerStringArray[0][0]);    
for($z = 0; $z < $zcount; $z++){
    for($y = 0; $y < $ycount; $y++){
        for($x = 0; $x < $xcount; $x++){
            echo $answerStringArray[$x][$y][$z]."\n";
        }
        if($y < $ycount-1) echo "\n";
    }
    if($z < $zcount-1) echo "\n";
}
echo "***";

这适用于sandbox.onlinephpfunctions.com

答案 1 :(得分:0)

假设所有数组都是同构的(它们具有相同的长度),你可以这样做:

for($i = 0; $i<count($awnswerStringArray[0][0])){
    foreach($answerStringArray as $element){
       echo $element[0][$i];
    }
}