#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
Смотрите рабочий код
для примера
С уважением
Ответ №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. С обновленным вопросом, да. Изначально в его вопросе не было информации об отладке.