循环遍历二维数组,对列中的值进行更改操作
Loop through a two-dimensional array with actions on change of a value in a column
循环遍历二维数组(表示 table)时的一个非常常见的问题是只有当列中的值发生变化时才执行操作。举个具体的例子:
从表格数据中输出一些HTML。
鉴于此 table
category | product
------------------
Vehicles | Bike
Vehicles | Car
Clothes | Shirt
像这样创建 HTML:
<h1>Vehicles</h1>Bike<br />Car<hr />
<h1>Clothes</h1>Shirt<hr />
为了解决这个问题,我可以这样修改代码:
$current_category = '';
$first = true;
foreach($table as $row){
if ($row['category'] != $current_category){
if(!$first){
// after a group
$echo '<hr />';
}
// before a group
echo '<h1>'.$row['category'].'</h1>';
} else if (!$first){
// inside a group
echo '<br />';
}
// foreach line
echo $row['category'];
$current_category = $row['category'];
$first = false;
}
// after a group, duplicated code
$echo '<hr />';
我觉得这比必要的更复杂。还有我想在组后执行的代码重复。
这个相对简单的需求的代码已经很复杂了。如果我们需要观察数组中两个变化的列,这几乎是不可能的。
我正在寻找一种解决此问题的方法,它使代码易于阅读,同时能够遍历数组并执行一些代码
- foreach 行
- 一组行前
- 一组行后
- 一组线内
我希望问题很清楚,尽管我很难用简单的术语解释这个普遍的问题。
您可以将产品存储在类别数组中
$categories = [];
foreach ($table as $row) {
$categories[$row['category']][] = $row['product'];
}
然后直接用内爆输出它们,在每个值之间换行
foreach ($categories as $category => $products) {
echo '<h1>' . $category . '</h1>';
echo implode ('<br>', $products);
}
对于一般问题,这将给出如下内容:
$categories = [];
foreach($table as $row) $categories[$row['category']][] = $row;
foreach($categories as $category => $rows){
// before a group
echo '<h1>'.$row['category'].'</h1>';
$first = true;
foreach($rows as $row){
if(!$first){
// inside a group
echo '<br />';
}
// foreach line
echo $row['category'];
$first = false;
}
// after a group
$echo '<hr />';
}
循环遍历二维数组(表示 table)时的一个非常常见的问题是只有当列中的值发生变化时才执行操作。举个具体的例子:
从表格数据中输出一些HTML。
鉴于此 table
category | product
------------------
Vehicles | Bike
Vehicles | Car
Clothes | Shirt
像这样创建 HTML:
<h1>Vehicles</h1>Bike<br />Car<hr />
<h1>Clothes</h1>Shirt<hr />
为了解决这个问题,我可以这样修改代码:
$current_category = '';
$first = true;
foreach($table as $row){
if ($row['category'] != $current_category){
if(!$first){
// after a group
$echo '<hr />';
}
// before a group
echo '<h1>'.$row['category'].'</h1>';
} else if (!$first){
// inside a group
echo '<br />';
}
// foreach line
echo $row['category'];
$current_category = $row['category'];
$first = false;
}
// after a group, duplicated code
$echo '<hr />';
我觉得这比必要的更复杂。还有我想在组后执行的代码重复。
这个相对简单的需求的代码已经很复杂了。如果我们需要观察数组中两个变化的列,这几乎是不可能的。
我正在寻找一种解决此问题的方法,它使代码易于阅读,同时能够遍历数组并执行一些代码
- foreach 行
- 一组行前
- 一组行后
- 一组线内
我希望问题很清楚,尽管我很难用简单的术语解释这个普遍的问题。
您可以将产品存储在类别数组中
$categories = [];
foreach ($table as $row) {
$categories[$row['category']][] = $row['product'];
}
然后直接用内爆输出它们,在每个值之间换行
foreach ($categories as $category => $products) {
echo '<h1>' . $category . '</h1>';
echo implode ('<br>', $products);
}
对于一般问题,这将给出如下内容:
$categories = [];
foreach($table as $row) $categories[$row['category']][] = $row;
foreach($categories as $category => $rows){
// before a group
echo '<h1>'.$row['category'].'</h1>';
$first = true;
foreach($rows as $row){
if(!$first){
// inside a group
echo '<br />';
}
// foreach line
echo $row['category'];
$first = false;
}
// after a group
$echo '<hr />';
}