2015-09-10 5 views
0

Я хотел бы отсортировать массив, используя PHP. Основная проблема заключается в том, что мне нужно для сортировки массива на основе нескольких критериев:Сортировка по нескольким критериям по ключам и значениям

  • первого шоу на сайтах с ценой
  • если цена одинакова, не сортировать их по алфавиту
  • если несколько сайтов не имеют цена, сортировать их по алфавиту

Так этот массив

array(
    [Beslist.nl] => Array 
     (
      [price] => 141,63 
     ) 

    [Wehkamp.nl] => Array 
     (
      [price] => none 
     ) 

    [Bol.com] => Array 
     (
      [price] => none 
     ) 

    [Zalando.nl] => Array 
     (
      [price] => none 
     ) 

    [Webwinkel.nl] => Array 
     (
      [price] => none 
     ) 

    [Overig.nl] => Array 
     (
      [price] => none 
     ) 
) 

Должно быть отсортирован Ли ка это:

array(
    [Beslist.nl] => Array 
     (
      [price] => 141,63 
     ) 

    [Bol.com] => Array 
     (
      [price] => none 
     ) 

    [Overig.nl] => Array 
     (
      [price] => none 
     ) 

    [Webwinkel.nl] => Array 
     (
      [price] => none 
     ) 

    [Wehkamp.nl] => Array 
     (
      [price] => none 
     ) 

    [Zalando.nl] => Array 
     (
      [price] => none 
     ) 

) 

Я попытался asort и ksort, но мне нужно сортировать на основе нескольких критериев, что делает его более сложным. Я надеялся, что смогу сортировать записи, используя SQL (когда я читаю записи из базы данных). Тем не менее, цена должна быть рассчитана впоследствии; поэтому мне нужно использовать PHP.

Любой, кто может мне помочь?

+0

Вы в переполнении стека, что кто-то должен скопировать и вставить свой заголовок в google и получить ответ в первом результате? – Rizier123

+3

Посмотрите функцию PHP '' usort() '(http://php.net/manual/en/function.usort.php). – Simba

+0

Вы читали [Ссылка: все основные способы сортировки массивов и данных в PHP] (http://stackoverflow.com/a/17364128/476)? - Я сразу же закрою это как дубликат, но я дам вам, что есть крошечный поворот в том, как выглядит ваша структура данных. – deceze

ответ

1

Есть совершенно подходящие подходы, подробно описанные here, но, учитывая реальную структуру вашего массива, это, вероятно, требует немного большего объяснения. В частности, вот как вы можете сортировать обеими ключами и значениями:

uksort($array, function ($siteA, $siteB) use ($array) { 
    $priceA = $array[$siteA]['price']; 
    $priceB = $array[$siteB]['price']; 

    if ($priceA == $priceB) { 
     return strcmp($siteA, $siteB); 
    } 
    if (!$priceB) { 
     return -1; 
    } 
    if (!$priceA) { 
     return 1; 
    } 
    return $priceB - $priceA; 
}); 

Вы, возможно, потребуется скорректировать конкретные сравнения и возвращения логики здесь, но это иллюстрирует подход.

+0

Удивительный! Спасибо чувак! Я смотрел на ваш ответ здесь: http://stackoverflow.com/questions/31183575/access-array-key-using-uasort-in-php Но он не мог заставить его работать :(Но это работает отлично, так что, спасибо! –

+0

Остался один вопрос: я изменил '' 'return $ priceB - $ priceA;' '' '' 'return $ priceA - $ priceB;' '' так что цены от высоких до низких. «Нет цены» должно быть внизу. Итак, сначала цены от низкого к высокому, а затем «без цен». Любые советы? Пытался изменить разные значения, но пока не повезло. –

+1

Вот что 'if (! $ priceA) 'условия для. * Если цены равны, сортируйте по сайту, иначе, если цена B ничто, тогда A выше, иначе, если цена A ничто, B выше, иначе сортируйте по цене. * Отрегулируйте эти условия соответственно что ваше фактическое «нет» значение цены. – deceze

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