Как отсортировать массив ассоциативных массивов по значению заданного ключа в PHP?

Учитывая этот массив:

$inventory = array(

   array("type"=>"fruit", "price"=>3.50),
   array("type"=>"milk", "price"=>2.90),
   array("type"=>"pork", "price"=>5.43),

);

Я бы хотел отсортировать $inventory элементов по цене , чтобы получить:

$inventory = array(

   array("type"=>"pork", "price"=>5.43),
   array("type"=>"fruit", "price"=>3.50),
   array("type"=>"milk", "price"=>2.90),

);

Как я могу это сделать?

вопрос задан 20.10.2009
Matt
8160 репутация

17 ответов


  • 447 рейтинг

    Вы правы, функция, которую вы ищете - array_multisort() .

    Вот пример, взятый прямо из руководства и адаптированный к вашему случаю:

    $price = array();
    foreach ($inventory as $key => $row)
    {
        $price[$key] = $row['price'];
    }
    array_multisort($price, SORT_DESC, $inventory);
    
    ответ дан Josh Davis, с репутацией 22158, 21.10.2009
  • 39 рейтинг

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

    function invenDescSort($item1,$item2)
    {
        if ($item1['price'] == $item2['price']) return 0;
        return ($item1['price'] < $item2['price']) ? 1 : -1;
    }
    usort($inventory,'invenDescSort');
    print_r($inventory);
    

    Производит следующее:

    Array
    (
        [0] => Array
            (
                [type] => pork
                [price] => 5.43
            )
    
        [1] => Array
            (
                [type] => fruit
                [price] => 3.5
            )
    
        [2] => Array
            (
                [type] => milk
                [price] => 2.9
            )
    
    )
    
    ответ дан zombat, с репутацией 74152, 20.10.2009
  • 21 рейтинг

    Я закончил на этом:

    function sort_array_of_array(&$array, $subfield)
    {
        $sortarray = array();
        foreach ($array as $key => $row)
        {
            $sortarray[$key] = $row[$subfield];
        }
    
        array_multisort($sortarray, SORT_ASC, $array);
    }
    

    Просто вызовите функцию, передав массив и имя поля массива второго уровня. Нравится:

    sort_array_of_array($inventory, 'price');
    
    ответ дан Danielzt, с репутацией 353, 23.11.2012
  • 8 рейтинг
    $inventory = 
        array(array("type"=>"fruit", "price"=>3.50),
              array("type"=>"milk", "price"=>2.90),
              array("type"=>"pork", "price"=>5.43),
              );
    
    function pricesort($a, $b) {
      $a = $a['price'];
      $b = $b['price'];
      if ($a == $b)
        return 0;
      return ($a > $b) ? -1 : 1;
    }
    
    usort($inventory, "pricesort");
    // uksort($inventory, "pricesort");
    
    print("first: ".$inventory[0]['type']."\n\n");
    // for usort(): prints milk (item with lowest price)
    // for uksort(): prints fruit (item with key 0 in the original $inventory)
    
    // foreach prints the same for usort and uksort.
    foreach($inventory as $i){
      print($i['type'].": ".$i['price']."\n");
    }
    

    выходов:

    first: pork
    
    pork: 5.43
    fruit: 3.5
    milk: 2.9
    
    ответ дан danamlund, с репутацией 426, 20.10.2009
  • 1 рейтинг

    Вы можете попытаться определить собственную функцию сравнения, а затем использовать usort .

    ответ дан Alex Sexton, с репутацией 9603, 20.10.2009
  • -3 рейтинг

    попробуйте это:

    asort($array_to_sort, SORT_NUMERIC);
    

    для справки см. Это: http: // php. нетто / ручной / EN / функция. asort. php

    см. Различные флаги сортировки здесь: http: // www. PHP. нетто / ручной / EN / функция. Сортировать. php

    ответ дан sarsnake, с репутацией 9792, 20.10.2009