如何为这个数组(make/model/year/engine size)编写for循环


how to write the for loops for this array (make/model/year/engine size)

<?php
error_reporting(0);
$mmy = array(array("Chevrolet Truck", "C 1500 SERIES", "2005", "V8 5.7L (K)"),
    array("Nissan Pickup", "D21 PICKUP", "1993", "2.4 L"),
    array("TOYOTA CAMRY", "LE", "2001", "2.8L V6")
);
var_dump($mmy);

echo "<pre>";
echo "<h1>Data in 2-dimensional array Make/Model/Year/Engine</h1>";
echo "<ul>";
for ($row = 0; $row < 3; $row++) {
    echo "<li><b>The row number $row</b>";
    echo "<ul>";
    for ($make = 0; $make < 4; $make++) {
        echo "<li>" . $mmy[$row][$make] . "</li>";
    }
    for ($model = 1; $model < 4; $model++) {
        echo "<li>" . $mmy[$row][$make][$model] . "</li>";
    }
    for ($year = 2; $year < 4; $year++) {
        echo "<li>" . $mmy[$row][$make][$model][$year] . "</li>";
    }
    for ($eng = 3; $eng < 4; $eng++) {
        echo "<li>" . $mmy[$row][$make][$model][$year][$eng] . "</li>";
    }
    echo "</ul>";
    echo "</li>";
}
echo "</ul>";
?>

不抑制错误报告,我得到:http://dpaste.org/iy0rD/L9

我不清楚偏移错误来自哪里。我不习惯用PHP编程。我必须编写一个PHP应用程序来导入CSV文件并显示结果。这只是整个计划的一部分。现在我已经静态地定义了这个数组,以便进行测试。希望这个问题的格式正确

假设我理解您要做的事情,那么您在$ my数组上迭代的方式是不正确的。通过这样定义它:

$mmy = array(array("Chevrolet Truck", "C 1500 SERIES", "2005", "V8 5.7L (K)"),
    array("Nissan Pickup", "D21 PICKUP", "1993", "2.4 L"),
    array("TOYOTA CAMRY", "LE", "2001", "2.8L V6")
);

你正在创建一个包含3个条目的数组:每个数组包含4个条目。它们存储在键0-3处。因此,要对数组进行迭代,可以这样做:

for ($i = 0; $i < count($mmy); $i++) {
    $row = $mmy[$i];
    echo "<li><b>The row number $i</b>";
    echo "<ul>";
    for ($j = 0; $j < count($row); $j++) {
       echo "<li>" . $row[$j] . "</li>";
    }
    echo "</ul>";
}

这将遍历外部行,生成一个ul标记,然后在它内部将为内部数组中的每个元素生成一个li标记。

这里只需要一个内循环。外部循环将遍历$ my中的所有顶层条目,而内部循环将遍历内部数组中的内容。

一个可能更好的解决方案是使用带有用户定义键的数组,如下所示:
$mmy = array(
    array('make' => "Chevrolet Truck", 'model' => "C 1500 SERIES", 'year' => "2005", 'engine' => "V8 5.7L (K)"),
    array('make' => "Nissan Pickup", 'model' => "D21 PICKUP", 'year' => "1993", 'engine' => "2.4 L"),
    array('make' => "TOYOTA CAMRY", 'model' => "LE", 'year' => "2001", 'engine' => "2.8L V6")
);

通过这样定义数组,您可以像这样轻松地访问每个键处的值:

$mmy[0]['make'];    // This returns Chevrolet Truck, for the first (0th) element of the array, and the 'make' key

试试这个:

<?php
error_reporting(E_ALL);
$mmy = array(  array("Chevrolet Truck", "C 1500 SERIES", "2005","V8 5.7L (K)"),
                array("Nissan Pickup", "D21 PICKUP", "1993", "2.4 L"),
                array("TOYOTA CAMRY", "LE", "2001","2.8L V6")
            );
var_dump($mmy);

echo "<pre>";
echo "<h1>Data in 2-dimensional array Make/Model/Year/Engine</h1>";
echo "<ul>";
for ($row = 0; $row < 3; $row++) {
    echo "<li><b>The row number $row</b>";
    echo "<ul>";
for ($make = 0; $make < 4; $make++) {
    echo "<li>".$mmy[$row][$make]."</li>";
}
for ($model = 3; $model < 3; $model++) {
    echo "<li>".$mmy[$row][$make][$model]."</li>";
}
for ($year = 3; $year < 3; $year++) {
    echo "<li>".$mmy[$row][$make][$model][$year]."</li>";
}
for ($eng = 3; $eng < 3; $eng++) {
    echo "<li>".$mmy[$row][$make][$model][$year][$eng]."</li>";
}
echo "</ul>";
echo "</li>";
}
echo "</ul>";
?>

这基本上意味着数组中的offset[4]不存在。使用isset()来确定数组中的项(键)是否存在。

for ($eng = 3; $eng < 3; $eng++) {
   if (isset($mmy[$row][$make][$model][$year][$eng])) {
      echo '<li>', $mmy[$row][$make][$model][$year][$eng], '</li>';
   }
}

可以使用以下两个基本循环:

foreach($theArray as $row){
    foreach($row as $column){
        echo $column;
    }
}
for($row=0;$row < count($array);$row++){
    for($column=0;$column < count($array[$row]);$column++){
        echo $array[$row][$column];
    }
}

如果你不关心索引号,那么使用foreach方法。如果你想使用索引号,那么使用for循环。

在你的例子中,你有一个二维数组,看起来像这样:

Make            | Model         | Year | Engine
Chevrolet Truck | C 1500 SERIES | 2005 | V8 5.7L (K)
Nissan Pickup   | D21 PICKUP    | 1993 | 2.4 L
TOYOTA CAMRY    | LE            | 2001 | 2.8L V6

要静态访问它们,可以这样做:

$firstMake = $mmy[0][0]; //meaning first row first column
$secondMake = $mmy[1][0];
$thirdYear = $mmy[2][2];

我希望这能澄清一点。

可以使用数组迭代器:

<?php
$data = array(
  array("Chevrolet Truck", "C 1500 SERIES", "2005", "V8 5.7L (K)"),
  array("Nissan Pickup", "D21 PICKUP", "1993", "2.4 L"),
  array("TOYOTA CAMRY", "LE", "2001", "2.8L V6")
);
$data = new ArrayObject($data);
$iterator = $data->getIterator();
while ($iterator->valid())
{
  $value = $iterator->current();
  echo "<ul><li>The row number is: {$iterator->key()}</li>";
  for ($x = 0; $x < count($value); $x++) {
    echo "<li>{$value[$x]}</li>";
  }
  echo "</ul>";
  $iterator->next();
}
?>

注意内部循环使用count,这确保循环只回显数组中定义的值(因此没有未定义的索引错误,应该有一个值丢失)。

错误来自echo s。PHP报告您所请求的对象(例如$mmy[$row][$make])不存在。

循环结束后:

for ($make = 0; $make < 4; $make++) {
    echo "<li>" . $mmy[$row][$make] . "</li>";
}

$make = 4,所以第一次通过下一个循环,PHP试图访问不存在的$mmy[0][4][1]。下面的循环也存在同样的错误。

您可以将循环放在彼此的内部,从而永远不会达到索引大于数组长度的点,但是您仍然需要更改数组访问,因为您正在尝试使用多维查找,但您的数组只有二维。或者,使用implode()作为输出数据的另一种方法。

echo "<pre>";
echo "<h1>Data in 2-dimensional array Make/Model/Year/Engine</h1>";
echo "<ul>";
for ($row = 0; $row < 3; $row++) {
    echo "<li><b>The row number $row</b>";
    echo "<ul><li>";
    echo implode("</li><li>", $mmy[$row]);
    echo "</li></ul>";
    echo "</li>";
}
echo "</ul>";
echo "</pre>";