Перегруппировать объект PHP - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть список объектов товара, он выглядит следующим образом:

Product Object
(
    [id:private] => 1688115
    [categoryId:private] => 1
    [merchant:private] => theredshop
    [name:private] => Pepsi Max Cans 6 x 375mL
)

данные каждой выборки, я получаю 15 записей (я использую ElasticSearch), для 15 записей заказ товара производится продавцомимя, так что это будет 1 торговец, сложенный сверху, затем перейдет к следующему торговцу.

Что я хочу сделать, это «перетасовать» порядок результата объекта, по крайней мере, на 1 торговое шоу один раз, а затем поставить другого торговца следующим,например, вот мой текущий результат:

merchant    name
theredshop  pepsi
theredshop  lorem
theredshop  ipsum

что я хочу, это

merchant    name
theredshop  pepsi
sevel       lorem
bluecircle  ipsum

Я знаю, как упорядочить результат, циклически проверяя и загружая имя продавца.но как я могу перестроить результат объекта обратно?или мне просто воссоздать объект?

1 Ответ

0 голосов
/ 11 февраля 2019

Предполагая, что таблица записей $products может быть написана на PHP следующим образом:

// restructure array as merchants having nested record sets
$merchants = [];
foreach(array_unique(array_column($products, 'merchant')) as $merchant)
  $merchants[$merchant] = array_values(array_filter($products, function($v)use($merchant){ return $v->merchant === $merchant;}));

// itererate over indexes up do max. products per merchant and a add a product of
// each merchant having a record with that index
$max_count = max(array_map(function($v){return count($v);}, $merchants));
$new_order = [];

for($i = 0; $i<$max_count; $i++)
  foreach ($merchants as $merchant)
    if($item = $merchant[$i] ?? false)
      $new_order[] = $item;


var_dump($new_order);

В соответствии с вашими комментариями у вас, похоже, есть объект, который вы назвали "list", похожим на этот:

$products_object = (object)
  [
    (object)[
      'merchant' => 'theredshop',
      'name'     => 'pepsi',
    ],
    (object)[
      'merchant' => 'sevel',
      'name'     => 'pepsi',
    ],
    (object)[
      'merchant' => 'sevel',
      'name'     => 'lorem',
    ],

    (object)[
      'merchant' => 'sevel',
      'name'     => 'ipsum',
    ],

    (object)[
      'merchant' => 'bluecircle',
      'name'     => 'ipsum',
    ],

  ];

Сначала преобразуйте его в массив, чтобы работать с функциями массива:

$products = (array) $products_object;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...