@yberpoc

Как отсортировать один большой массив по категориям в этом же массиве PHP?

Через API мне приходит большой массив с товарами и категориями одновременно. Категории приходят на одном уровне с товарами. Каждая категория имеет ключ ['id'], а каждый товар имеет ключ ['parent_id']. Эти ключи совпадают. Мне нужно как-то вложить все товары в категории, у которых ['parent_id'] совпадают с ['id'], чтобы не было каши при выводе этого массива.
Я очень тупо объяснил, но иначе не знаю как.
  • Вопрос задан
  • 125 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Как-то так, например
<?php
$data = [
    [
        'id' => 1,
        'parent_id' => 100,
        'name' => 'Стулья'
    ], [
        'id' => 2,
        'parent_id' => 100,
        'name' => 'Столы'
    ], [
        'id' => 5,
        'parent_id' => 1,
        'name' => 'Стул Сакура',
        'price' => 5691,
        'img' => 'lorempixel.com/900/900/?q=5',
        'props' => []
    ], [
        'id' => 9,
        'parent_id' => 2,
        'name' => 'Стол Византия',
        'price' => 5268,
        'img' => 'lorempixel.com/900/900/?q=9',
        'props' => []
    ]
];

function build_tree($data, $id) {
    $result = [];
    foreach ($data as $el) {
        if ($el['parent_id'] == $id) {
            $newEl = $el;
            $childs = build_tree($data, $el['id']);
            if (count($childs) !== 0) {
                $newEl['childs'] = $childs;
            }
            $result[] = $newEl;
        }
    }
    return $result;
}

$tree = build_tree($data, 100);
print_r($tree);

/*
Array (
  [0] => Array (
    [id] => 1
    [parent_id] => 100
    [name] => Стулья
    [childs] => Array (
      [0] => Array (
        [id] => 5
        [parent_id] => 1
        [name] => Стул Сакура
        [price] => 5691
        [img] => lorempixel.com/900/900/?q=5
        [props] => Array ()
      )
    )
  )
  [1] => Array (
    [id] => 2
    [parent_id] => 100
    [name] => Столы
    [childs] => Array (
      [0] => Array (
        [id] => 9
        [parent_id] => 2
        [name] => Стол Византия
        [price] => 5268
        [img] => lorempixel.com/900/900/?q=9
        [props] => Array ()
      )
    )
  )
)
*/
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
aliencash
@aliencash
Партизан
пробегитесь в цикле по все элементам массива. если элемент массива обладает ключом parent_id - это товар, добавляйте его в двумерный массив result, где первым ключом будет значение parent_id. Если parent_id не установлен - это категория, сложите элемент с массивом result.

с учетом представленнового формата ответа, вот такой код:
$answer = array(
            array("id" => 1, "parent_id" => 100, "name" => "Стулья"),
            array("id" => 2, "parent_id" => 100, "name" => "Столы"),
            array("id" => 5, "parent_id" => 1, "name" => "Стул Сакура", "price" => 5691, "img" => "lorempixel.com/900/900/?q=5", "props" => array()),
            array("id" => 9, "parent_id" => 2, "name" => "Стол Византия", "price" => 5268, "img" => "lorempixel.com/900/900/?q=9","props" => array())
    );
$result = array();
foreach($answer as $item) {
    if(isset($item['price'])) $result[$item['parent_id']][] = $item;
        else $result[$item['id']] = $item;
}
var_dump($result);
Ответ написан
Ваш ответ на вопрос

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

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