【问题标题】:PHP foreach loop show each list item while only showing list name oncePHP foreach 循环显示每个列表项,而只显示列表名称一次
【发布时间】:2013-02-17 04:47:16
【问题描述】:

请比较下面的CURRENTDESIRED 结果,看看我想要做什么。

$arr=array(
array('list_name'=>'Food', 'list_item'=>'bread'),
array('list_name'=>'Food', 'list_item'=>'meat'),
array('list_name'=>'Drinks', 'list_item'=>'water'),
array('list_name'=>'Drinks', 'list_item'=>'milk')
);

foreach($arr as $row){   
  echo $row['list_name'].'<br>'; 
  echo $row['list_item'].'<br>';
  echo '<br>___<br>';
}

目前的结果

Food
bread

___
Food
meat

___
Drinks
water

___
Drinks
milk

___

期望的结果

Food
1.bread
2.meat
___

Drinks
1.water
2.milk
___

更新

更复杂但更普遍的例子:

$arr=array(
array('list_name'=>'Food', 'list_item1'=>'bread', 'list_item2' => 2001),
array('list_name'=>'Food', 'list_item1'=>'meat', 'list_item2' => 2002),
array('list_name'=>'Drinks', 'list_item1'=>'water', 'list_item2' => 2003),
array('list_name'=>'Drinks', 'list_item1'=>'milk', 'list_item2' => 2004)
);

期望的结果

Food
1.bread, 2001
2.meat, 2002
___

Drinks
1.water, 2003
2.milk, 2004
___

【问题讨论】:

  • 为什么投反对票?我想我写了一个高质量的问题。
  • 我认为你应该更好地描述你的问题......
  • 对我来说似乎很清楚
  • 我认为从标题和比较当前结果与期望结果来看,它非常自我解释。
  • 我相信他的意思是你的问题很清楚(与 jadkik94 的观点相反)。

标签: php multidimensional-array foreach


【解决方案1】:

您可以遍历数组并将项目数据添加到新数组(每个 list_name 一个)。

例如:

$new_array = array();

foreach ($arr as $row)
{
  $new_array[$row['list_name']][] = $row['list_item'];
}

foreach ($new_array as $name => $items)
{

  echo $name . '<br>'; 

  foreach ($items as $index => $item)
  {
    echo ($index + 1) . '. ' . $item . '<br>';
  }

  echo '___<br>';

}

随着您的更新:

$new_array = array();

foreach ($arr as $row)
{

  $name = $row['list_name'];

  unset($row['list_name']);

  $new_array[$name][] = $row;

}

foreach ($new_array as $name => $items)
{

  echo $name . '<br>'; 

  foreach ($items as $index => $item)
  {
    echo ($index + 1) . '. ' . implode(', ', $item) . '<br>';
  }

  echo '___<br>';

}

【讨论】:

  • 简洁的方法;我已经在我的回答中挪用了你的一些代码作为替代方案,因为我过去有理由同时使用这两种代码:)
  • @MichaelRushton 为了使其更具概括性,我想知道如果列表包含更多项目,如何扩展您的答案。我现在要把它添加到我的问题中。
  • 它适用于任意数量的list_items 和任意数量的list_names。或者你的意思是如果有进一步的故障?例如。食物 => 面包 => 霍维斯?
  • @MichaelRushton 不,没有进一步的细分。你能看到我更新的答案/想要的结果吗?抱歉,我现在自己正在解决这个问题。
  • @MichaelRushton 我当然不是编码大师。您会认为这种有效的解决方案还是可行的解决方案?如果我可以重新设置数据的方式,您是否看到了更好的方法?还是我不应该关心这些东西?
【解决方案2】:
$arr=array(
array('list_name'=>'Food', 'list_item'=>'bread'),
array('list_name'=>'Food', 'list_item'=>'meat'),
array('list_name'=>'Drinks', 'list_item'=>'water'),
array('list_name'=>'Drinks', 'list_item'=>'milk')
);

$names = array();

foreach ( $arr as $item){
    $name = $item['list_name'];
    if(!in_array($name, $names)){
        $names[] = $name;
        echo $name ."<BR>";
    }
    echo $item['list_item']."<BR>";
}

【讨论】:

  • 您能否就这段代码的作用添加一些评论?如果我没看错,这和我的第一个建议是一样的,但是如果列表没有正确排序,它会在错误的标题下回显项目,而我的会产生重复的标题。
  • 你测试过你的任何一个吗?给定初始数组,它们不起作用
  • 我实际上很想用伪代码编写我的,因为我正在解释一般模式。如果他们有问题,请在我的回答中添加为 cmets。
【解决方案3】:

一个常见的方法是在循环遍历列表时将当前标题/部分存储到一个变量中。然后每次遇到新标题时,都会回显该标题,然后重新开始编号(或关闭 HTML &lt;ol&gt; 标记等)。

$current_section = NULL;
foreach ( $arr as $row )
{
    if ( $current_section != $row['list_name'] )
    {
        // Begin new section
        echo $row['list_name'];
        // Remember current section
        $current_section != $row['list_name'];
    }

    // Output current item
    echo $row['list_item'];
}

请注意,此方法在您的列表按所有“食物”项放在一起,然后是所有“饮料”等情况下才有效。

否则,您可以使用重新构造数组的替代方法,以便每个部分都有一个子数组,然后使用一对嵌套循环:

$new_array = array();
foreach ($arr as $row)
{
    $new_array[$row['list_name']][] = $row['list_item'];
}

foreach ( $new_array as $section_name => $items )
{
    echo $section_name;
    foreach ( $items as $row )
    {
        echo $row;
    }
}

【讨论】:

    【解决方案4】:

    好的,我之前犯了一个错误,但我测试了它,它确实有效。

    <?php
    $food = array('bread', 'meat');
    $drink = array('water', 'milk');
    
    $object = array('food' => $food, 'drink' => $drink);
    
    foreach($object as $row){   
      echo $row[0].'<br>'; 
      echo $row[1].'<br>';
      echo '<br>___<br>';
    }
    ?>
    

    【讨论】:

    • 正如我对您之前的回答所评论的那样,这仅在您可以控制源数据结构时才有用。问题中的代码显然是一个示例,并且可能来自代码中的其他地方。
    • 也许可以,但我只能使用原始问题中给出的参数。
    • 我的意思是您没有使用原始问题中的参数。您正在发明一种完全不同的数据结构。
    • 一点也不。在最初的问题中,他自己定义了数组。我也这样做了。
    • 好的。足够的辩论。让 gt 重新开始享受编码的乐趣吧!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 2019-06-14
    相关资源
    最近更新 更多