@DeniSidorenko

Каким образом получить новый массив из текущего?

Через переменную получаю такой массив вывода продукта
array(4) {
  [0]=>
  array(3) {
    ["name"]=>
    string(58) "Адаптер прямоугольного сечения"
    ["price"]=>
    string(8) "300 руб."
    ["catID"]=>
    string(1) "7"
    ["catName"]=>
    string(60) "Воздуховоды квадратного сечения"
  }
  [1]=>
  array(3) {
    ["name"]=>
    string(43) "Воздуховод прямошовный"
    ["price"]=>
    string(8) "500 руб."
    ["catID"]=>
    string(1) "8"
    ["catName"]=>
    string(54) "Воздуховоды круглого сечения"
  }
  [2]=>
  array(3) {
    ["name"]=>
    string(51) "Врезка круглая в воздуховод"
    ["price"]=>
    string(8) "60 руб."
    ["catID"]=>
    string(1) "8"
    ["catName"]=>
    string(54) "Воздуховоды круглого сечения"
  }
  [3]=>
  array(14) {
    ["name"]=>
    string(56) "Заглушка воздуховода торцевая"
    ["price"]=>
    string(8) "900 руб."
    ["catID"]=>
    string(1) "7"
    ["catName"]=>
    string(60) "Воздуховоды квадратного сечения"
  }
}


В данном примере 3 продукта относиться к категории №7 ( catID) а один к №8

Задача, вывести по категориям, что бы на странице формировалась такая структура
<div class="category-wrap">

    <div class="category-name"><span>Названия категории №1</span></div>
    <div class="category-products">
      <div class="category-product">
        <div class="category-product__name">Имя продукта</div>
        <div class="category-product-price">Цена продукта</div>
      </div>
      <div class="category-product">
        <div class="category-product__name">Имя продукта</div>
        <div class="category-product-price">Цена продукта</div>
      </div>
    </div>
  </div>

  <div class="category-wrap">

    <div class="category-name"><span>Названия категории №2</span></div>
    <div class="category-products">
      <div class="category-product">
        <div class="category-product__name">Имя продукта</div>
        <div class="category-product-price">Цена продукта</div>
      </div>
    </div>
  </div>


Я подумал сделать следующим образом. Пройтись по массиву, и сравнивать ID категории, создавая новые массивы , где каждый массив будет иметь названия категории, ид, и внутри массив с продукции которые относяться к данной категории. По логике понимаю как сделать но возникли трудности с реализации. Буду очень признателен за помощь.
  • Вопрос задан
  • 97 просмотров
Решения вопроса 2
Maksclub
@Maksclub Куратор тега PHP
maksfedorov.ru
1. Сгруппировать товары по catID и категории также:
$products = [];  // ваш массив с товарами

/** 
 *  Группирует любой массив  массивов по любому полю $indexKey в качестве индекса
 */
function groupBy(array $input, string $indexKey): array
{
    return array_reduce($input,  function($res, $data) use ($indexKey){
        if (!isset($data[$indexKey])) {
             return $res;
        }
        
        $res[$data[$indexKey]][] = $data;
            
        return $res;
    }, []);
}

$groupedProducts = groupBy($products, 'catID');
// такое работает при условии, что категория с одним id будет иметь последнее название из найденных, 
// то есть если id один, а название разные, то возможны не ожидаемые результаты
$categories = array_column($products, 'catName', 'catID');


2. Потом просто идете в цикле и выводите:
foreach($groupedProducts as $catId => $catProducts) {
     // тут доступно название категории $categories[$catId] и ее $catId

     foreach($catProducts as $product) {
          // тут выводим сами товары $product
     }
}


Для PHP 5 нужно [] заменить на array(), предлагаю это сделать самому :)
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
Сразу получить из БД с нужной группировкой
$sql = "SELECT catID, catName, p.* FROM prod p, cat c WHERE c.id=p.catID";
$data = $pdo->query($sql)->fetchAll(PDO::FETCH_GROUP);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы