Сокращение циклов Foreach?

#php

#php

Вопрос:

Он поместил данные в массив $itemsData[] из цикла ModelItem::find()

Когда я выводю данные, мне приходится выполнять 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 amp; xxxx xxxxx
                    [category_id] => 424
                )

        )

)
  

Комментарии:

1. Почему вы хотите поместить это в один foreach ?

Ответ №1:

Причина, по которой вам нужно использовать 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() напрямую.

Ответ №2:

правильный код — это

 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

для примера

С уважением

Ответ №3:

Мне кажется, вы уже можете выполнить один цикл:

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

Комментарии:

1. @halfdan у него вложенные массивы, предлагаемое решение не будет работать.

2. вы получаете мой 1, потому что это не так уж плохо, но в любом случае это не сработало бы, потому что $item это массив

3. @user622378 Да, это будет работать, если $item то, что вы помещаете в массив, на самом деле является объектом с (доступным) свойством name. Вы бы поняли, почему это не работает в вашем случае, если бы отладили переменные $itemsData / $item и увидели, что это не объект, который вы туда помещаете. Я не могу знать, какая переменная возвращается, поскольку я не знаю, что возвращает modelItem::find функция, я просто скопировал то, что вы уже указали в своем вопросе: echo $item->name

4. @Питер, точно! Вы увидели код, просто скопировали фрагмент и сказали here it is . В следующий раз рассмотрите возможность прочтения вопроса полностью. Это не сработает. вы можете ясно видеть, что у него есть вложенные массивы.

5. С обновленным вопросом, да. Изначально в его вопросе не было информации об отладке.