2011-04-15 117 views
0

它将数据从modelItem :: find()循环中放入$ itemsData []数组中减少Foreach循环?

当我输出数据时,我必须做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 
       ) 

     ) 

) 
+0

*为什么*您是否希望把它放在一个'的foreach '? – 2011-04-15 11:52:31

回答

2

你需要使用的foreach两次究其原因,是因为MySQL本身,返回一个集合。 “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

在我看来,你已经可以做一个循环:

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

downvoter能解释他的-1吗? IMO这是正确的。 – halfdan 2011-04-15 11:50:49

+0

不,那不行。错误:注意:试图获取非对象的属性.. – user622378 2011-04-15 11:51:21

+0

我不认为这真的值得downvote。 – m4rc 2011-04-15 11:52:45

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; 
    } 
} 

什么它基本上是,假定$项目阵列仅具有一个元素,并通过移呼应元件使用这个元素。知道PHP的阵列功能总是很好。看看

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

请参阅使用代码

http://codepad.org/lyDlutFm

为例

问候