2016-11-20 6 views
2

Я использую usort для сортировки массива объектов, но на самом деле я хочу, чтобы это действовало как своего рода функция «group by», не нарушая первоначальный относительный порядок строк.Значение объектов сортировки PHP, но сохранить исходный относительный порядок

Скажем, у меня есть это:

MASTER_CODE, CONFIG_ITEM 
foo1, opt_ray 
foo2, opt_ray 
foo1, opt_fah 
foo2, opt_doe 

Из этих данных массив объектов построен с анонимным ключом. То есть, каждая строка анализируется как объект. Объекты собираются в массив.

Что я хочу сделать, так это отсортировать массив по значению MASTER_CODE, но не нарушая порядок.

То есть, окончательный порядок должен быть:

MASTER_CODE, CONFIG_ITEM 
foo1, opt_ray 
foo1, opt_fah 
foo2, opt_ray 
foo2, opt_doe 

Мы не добавляем порядок сортировки, так как данные поступают из внешнего источника.

Я могу использовать usort для заказа по мастер-коду, но это испортит первоначальный относительный порядок.

Любые предложения?

+0

Возможный дубликат [Сохранить порядок ключей (стабильный сортировки) при сортировке с uasort РНР] (http://stackoverflow.com/questions/4353739/preserve-key-order-stable-sort -when-sorting-with-phps-uasort) – max

ответ

0

Это один из вариантов - это не самое элегантное решение. Он будет принимать уникальные значения из первого столбца вашего массива (тот, который вы хотите отфильтровать), сортировать его, затем зацикливать и добавить записи из исходного массива с тем же первым значением.

// Get an unique array of values to use for sorting 
$sorting = array_unique(array_column($a, 0)); 
sort($sorting); 

$sorted = []; 
foreach ($sorting as $sortValue) { 
    $sorted = array_merge(
     $sorted, 
     array_filter(
      $a, 
      function($row) use ($sortValue) { 
       // Find values that have the same first value as each sort value 
       return ($sortValue === $row[0]); 
      } 
     ) 
    ); 
} 

Example

Примечание: Это будет работать на PHP 5.5. Поскольку вы также отметили PHP 5.3, вам может потребоваться заменить функцию array_column. Попробуйте что-то вроде этого:

$sorting = array_unique(array_map(function($row) { return $row[0]; }, $a)); 
+0

Хорошо, но важно помнить, что это массив объектов, а не массив массивов. Каждая строка данных анализируется как объект. Эти объекты накапливаются в массив. – Tim

+0

Несомненно. Можете ли вы опубликовать «var_export» фактического объекта, чтобы я мог еще раз взглянуть? –

+0

К сожалению, я не могу предоставить вам экспорт в качестве его конфиденциальных данных. – Tim

 Смежные вопросы

  • Нет связанных вопросов^_^