Работаю в CMS opencart. Есть вывод данных. В массиве есть поле article['geo_id'] - ID региона. PHP: <?php foreach ($articles as $article) { ?> <div class="swiper-slide" data-geoslide="<?php echo $article['geo_id']; ?>"> <?php if ($article['thumb']) { ?><div class="popup_img"><img src="<?php echo $article['thumb']; ?>" alt="<?php echo $article['name']; ?>" title="<?php echo $article['name']; ?>" class="img-responsive" /></div> <?php } ?> <div class="popup_content"> <div class="popup_wrap"> <div class="popup_title"><a href="<?php echo $article['href']; ?>"><?php echo $article['name']; ?></a></div> <div class="popup_text"> <?php echo $article['preview']; ?> </div> </div> </div> </div> <?php } ?> В итоге необходимо этот массив разбить на куски - сгруппировав по geo_id. В итоге должно получиться такое: PHP: <div data-geo="<?php echo $article['geo_id']; ?>" id="geo<?php echo $article['geo_id']; ?>" class="object-popup portfolio_geo"> <div class="btn_close"></div> <div class="swiper-geo<?php echo $article['geo_id']; ?> swiper-container"> <div class="swiper-wrapper"> <?php foreach ($articles as $article) { ?> <div class="swiper-slide" data-geoslide="<?php echo $article['geo_id']; ?>"> <?php if ($article['thumb']) { ?><div class="popup_img"><img src="<?php echo $article['thumb']; ?>" alt="<?php echo $article['name']; ?>" title="<?php echo $article['name']; ?>" class="img-responsive" /></div> <?php } ?> <div class="popup_content"> <div class="popup_wrap"> <div class="popup_title"><a href="<?php echo $article['href']; ?>"><?php echo $article['name']; ?></a></div> <div class="popup_text"> <?php echo $article['preview']; ?> </div> </div> </div> </div> <?php } ?> </div> </div> </div> То есть должны сформироваться слайдеры для каждого ГЕО. Подскажите как правильно реализовать?
foreach() - не про группировку, а про перебор всех значений Не очень понятно что вы хотите... - тот же самый вывод но что каждый слайд был со своим geo_id? а какова должна быть логика получения статьи из группы? то есть например для geo_id = 1 будет 5 статей ... вам нужно вывести 1... так? какую? 1-ю, последнюю, случайную? В целом решение такое - формируете новый массив по новой логике.. выводите как раньше выводили
Мне надо весь список статей сгруппировать по одинаковому geo - и сформировать слайдеры по каждому гео. Например у меня есть такие данные: - статья 1 (geo_id=1) - статья 2 (geo_id=2) - статья 3 (geo_id=1) - статья 4 (geo_id=2) - статья 5 (geo_id=1) - статья 6 (geo_id=1) - статья 7 (geo_id=3) - статья 8 (geo_id=1) - статья 9 (geo_id=3) - статья 10 (geo_id=1) - статья 111 (geo_id=2) В итоге мне надо вывести их так: geo_id=1 - статья 1 - статья 3 - статья 5 - статья 6 - статья 8 - статья 10 geo_id=2 - статья 2 - статья 4 geo_id=3 - статья 7 - статья 9
PHP: <?php $articles = [ [ 'geo_id' => 1, 'name' => 'статья 1' ], [ 'geo_id' => 2, 'name' => 'статья 2' ], [ 'geo_id' => 1, 'name' => 'статья 3' ], [ 'geo_id' => 3, 'name' => 'статья 4' ] ]; $geo_articles = []; foreach ($articles AS $item) { $geo_articles[$item['geo_id']][] = $item; } echo '<pre>';print_r($geo_articles); примерно так... как с искомого массива выводить (с вложенными циклами) наверное разберетесь?
А ещё в php есть ох*ный набор функций для фильтрации/изменения массивов. Можно творчески его использовать. Например, если использовать данные ADSoft: PHP: $geoIds = array_unique(array_column($articles, 'geo_id')); foreach ($geoIds as $geoId) { $filtered = array_filter($articles, fn ($row) => $row['geo_id'] == $geoId); echo "geo_id = {$geoId}\n"; foreach ($filtered as $row) { echo ": name = {$row['name']}\n"; } } выведет Код (Text): geo_id = 1 : name = статья 1 : name = статья 3 geo_id = 2 : name = статья 2 geo_id = 3 : name = статья 4
Ошибку выдает : Parse error: syntax error, unexpected '=>' (T_DOUBLE_ARROW), expecting ')' in В строке $filtered = array_filter($articles, fn ($row) => $row['geo_id'] == $geoId); Версия php 7.3
@greenzlat "стрелочные" функции как развитие анонимных функций появились в PHP 7.4 я бы не советовал сейчас пользоваться 7.3, она устарела. никто не будет проверять свои примеры на совместимость с тем, что устарело годы назад. просто прими это. https://www.php.net/supported-versions.php --- Добавлено --- переделать на не-стрелочный вариант можешь сам.