减少Foreach循环?

问题描述

| 它将数据从modelItem :: find()循环放入$ itemsData []数组中 输出数据时,我必须做两次foreach,如何简化为1个foreach循环?
$itemsData = array();
foreach ($_SESSION[\'Cart\'] as $optionid => $OptionData) {
    $item = modelItem::find(\'id = :item_id\',array(\'item_id\' => $OptionData[\'item_id\']));
    $itemsData[] = $item;
}


// How to put this in into single foreach?
foreach ($itemsData as $items) {
     foreach($items as $item) {
         echo $item->name;
     }
 }



Array
(
    [0] => Array
        (
            [0] => modelItem Object
                (
                    [id] => 319
                    [name] => xxxxxx xxxxxx
                    [category_id] => 434
                )

        )

    [1] => Array
        (
            [0] => modelItem Object
                (
                    [id] => 320
                    [name] => xxx & xxxx xxxxx
                    [category_id] => 424
                )

        )

)
    

解决方法

您需要使用两次foreach的原因是因为mysql本身会返回一个集合。 \“ modelItem :: find \”依次返回一个数组。 当您执行“ 1”时,将附加一个数组。导致嵌套数组。 一个简单的解决方案是更改:
$item = modelItem::find(\'id = :item_id\',array(\'item_id\' => $OptionData[\'item_id\']));
foreach($item as $x)
    $itemsData[] = $x;
但这仍然为您提供了学习的机会,因此您可能想尝试:
$item = modelItem::find(\'id = :item_id\',array(\'item_id\' => $OptionData[\'item_id\']));
$itemsData=array_merge($itemsData,$item);
在第二个示例中,您甚至可以直接传递
modelItem::find()
。     ,正确的代码是
foreach ($_SESSION[\'Cart\'] as $optionid => $OptionData) {
   $item = modelItem::find(\'id = :item_id\',array(\'item_id\' => $OptionData[\'item_id\']));
   if(!empty($item)){
     $item = array_shift($item);
     echo $item->name;
   }
}
它的基本操作是假设$ item数组只有一个元素,并通过shift使用此元素作为要回显的元素。始终了解PHP的数组函数总是很不错的。看一眼 http://php.net/manual/de/ref.array.php 查看工作代码 http://codepad.org/lyDlutFm 举个例子 问候     ,在我看来,您已经可以执行一个循环:
foreach ($itemsData as $item) {
     echo $item->name;
}