D
D
DeniSidorenko2020-04-23 11:04:53
PHP
DeniSidorenko, 2020-04-23 11:04:53

How to get a new array from the current one?

Through a variable I get such an array of product output

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) "Воздуховоды квадратного сечения"
  }
}


In this example, 3 products belong to category No. 7 ( catID) and one to No. 8

Task, display by category so that such a structure would be formed on the page
<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>


I thought to do it like this. Iterate over the array, and compare the category IDs, creating new arrays where each array will have the category name, id, and inside an array of products that belong to that category. Logically, I understand how to do it, but there were difficulties with the implementation. I would be very grateful for help.

Answer the question

In order to leave comments, you need to log in

1 answer(s)
M
Maksim Fedorov, 2020-04-23
@DeniSidorenko

1. Group products by catID and category also:

$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. Then just go in a loop and output:
foreach($groupedProducts as $catId => $catProducts) {
     // тут доступно название категории $categories[$catId] и ее $catId

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

Для PHP 5 нужно [] заменить на array(), предлагаю это сделать самому :)

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question