减少Foreach循环?

时间:2011-04-15 11:46:21

标签: php

它将数据放入来自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
                )

        )

)

3 个答案:

答案 0 :(得分:2)

你需要使用foreach两次的原因,是因为mysql本身返回一个set。 “modelItem :: find”依次返回一个数组。

执行$itemsData[] = $item;后,您追加一个数组。导致嵌套数组。

一个简单的解决方案就是改变:

$item = modelItem::find('id = :item_id', array('item_id' => $OptionData['item_id']));
foreach($item as $x)
    $itemsData[] = $x;

但这仍然给你一个foreach,所以你可能想尝试:

$item = modelItem::find('id = :item_id', array('item_id' => $OptionData['item_id']));
$itemsData=array_merge($itemsData, $item);

在第二个示例中,您甚至可以直接传递modelItem::find()

答案 1 :(得分:0)

正确的代码是

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将此元素用作echo的元素。了解PHP的数组函数总是很好。看看

http://php.net/manual/de/ref.array.php

参见工作代码

http://codepad.org/lyDlutFm

示例

此致

答案 2 :(得分:-1)

对我来说,你已经可以做一个循环:

foreach ($itemsData as $item) {
     echo $item->name;
}