2017-01-21 2 views
1

У меня есть следующие Красноречивые коллекции:коллекции Laravel не сортировочная

[ 
    [ 
     'id' => 60902, 
     'source' => 'M', 
     'price' => 10.15 
    ], 
    [ 
     'id' => 57348, 
     'source' => 'A', 
     'price' => 12.00 
    ], 
    [ 
     'id' => 54472, 
     'source' => 'A', 
     'price' => 12.00 
    ], 
] 

Я пытаюсь сортировать его с этим кодом:

$items = $items->sort(function (Item $a, Item $b) { 
    if ($a->source == 'A') { 
     if ($b->source == 'M' || ($b->source == 'A' && $a->price < $b->price)) { 
      return 1; 
     } elseif ($b->source == 'A' && $a->price == $b->price) { 
      return 0; 
     } else { 
      return -1; 
     } 
    } else { 
     if ($b->source == 'A' || ($b->source == 'M' && $b->price < $a->price)) { 
      return -1; 
     } elseif ($b->source == 'M' && $b->price == $a->price) { 
      return 0; 
     } else { 
      return 1; 
     } 
    } 
}); 

Однако первоначальный порядок сортировки $items всегда такой же до и после. Первый элемент (60902) в списке должен быть перемещен от начала до конца.

Я запустил трассировку Xdebug и могу видеть, что элемент 60902 возвратил -1 в функции сортировки, а два других возвращенных объекта 0, потому что они эквивалентны друг другу.

Это, как я ожидаю, что коллекция выглядеть после сортировки:

[ 
    [ 
     'id' => 57348, 
     'source' => 'A', 
     'price' => 12.00 
    ], 
    [ 
     'id' => 54472, 
     'source' => 'A', 
     'price' => 12.00 
    ], 
    [ 
     'id' => 60902, 
     'source' => 'M', 
     'price' => 10.15 
    ] 
] 

Где моя логика перепутались здесь?

+0

что вы хотите сделать?. сортировка по цене и сортировка по убыванию? – Vikash

+0

Я делаю сложный сорт по источнику и цене. Источник А предпочтительный над источником М. Если тот же источник, более низкая цена лучше, чем выше. – eComEvo

+0

Я знаю, что это не то, о чем вы просите, но если вы получите результат из базы данных, почему бы не заказать результат на уровне запросов к базе данных? 'ORDER BY source, price' должен это сделать. – lesssugar

ответ

0

Решение этого было смехотворно простым ... Мне просто нужно было обменять 1 и -1 при возврате значения сортировки, чтобы получить результаты, которые я хотел.

Новый код выглядит следующим образом:

$items = $items->sort(function (Item $a, Item $b) { 
    if ($a->source == 'A') { 
     if ($b->source == 'M' || ($b->source == 'A' && $a->price < $b->price)) { 
      return -1; 
     } elseif ($b->source == 'A' && $a->price == $b->price) { 
      return 0; 
     } else { 
      return 1; 
     } 
    } else { 
     if ($b->source == 'A' || ($b->source == 'M' && $b->price < $a->price)) { 
      return 1; 
     } elseif ($b->source == 'M' && $b->price == $a->price) { 
      return 0; 
     } else { 
      return -1; 
     } 
    } 
}); 

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

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