【问题标题】:Unable to loop correct values from multidimensional array无法从多维数组中循环正确的值
【发布时间】:2018-07-30 06:14:03
【问题描述】:

我正在尝试学习多维数组,并特意构建了以下名为$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"
        }
    }
}

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

Swimming
Running
Jogging 
Walking

在第一次迭代之后

Burgers
Chips
Salad
Sauce

等等等等

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

我尝试使用如下所示的循环,但它开始不同步,然后我意识到这可能是尝试做我所追求的事情的糟糕方式:

$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];

        }

      }
 }

【问题讨论】:

  • “我很感激我可以写 array[0][0][0]; 来打印 Swimming 等,但我想了解如何循环获取所需的数据。” ——这就是理解它的方式。如果你这样做,你会看到你应该以什么顺序循环索引,以及循环是否真的依赖于外部循环的索引。
  • 请标记为php

标签: php arrays for-loop multidimensional-array


【解决方案1】:

我很感激我可以写 array[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-loop 将在块):

$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 上运行良好

【讨论】:

  • 感谢您提供详细的回答 - 我现在将以此作为参考点,在未来处理此类情况方面的最佳实践。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 2018-07-27
    相关资源
    最近更新 更多