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

На основании ответа Томаса Уотнедала. Тем не менее, это точно не отвечает на прямую часть исходного вопроса. Функция может по-прежнему заменяться по принципу «строка-строка»

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

Также re.sub вместо замены, допускает замену регулярных выражений вместо простой замены текста.

Чтение файла в виде одной строки вместо строки за строкой позволяет выполнять многострочное совпадение и замену.

import re

def replace(file, pattern, subst):
    # Read contents from file as a single string
    file_handle = open(file, 'r')
    file_string = file_handle.read()
    file_handle.close()

    # Use RE package to allow for replacement (also allowing for (multiline) REGEX)
    file_string = (re.sub(pattern, subst, file_string))

    # Write contents to file.
    # Using mode 'w' truncates the file.
    file_handle = open(file, 'w')
    file_handle.write(file_string)
    file_handle.close()
381
задан Mark Amery 29 June 2019 в 14:08
поделиться

5 ответов

Вы правы, вам нужна функция array_multisort () .

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

$price = array();
foreach ($inventory as $key => $row)
{
    $price[$key] = $row['price'];
}
array_multisort($price, SORT_DESC, $inventory);

Начиная с PHP 5.5.0, вы можете использовать array_column () вместо этого foreach

$price = array_column($inventory, 'price');

array_multisort($price, SORT_DESC, $inventory);
544
ответ дан 22 November 2019 в 23:38
поделиться

попробуйте следующее:

asort($array_to_sort, SORT_NUMERIC);

для справки см. Это: http://php.net/manual/en/function.asort.php

см. Здесь различные флаги сортировки: http://www.php.net/manual/en/function.sort.php

-3
ответ дан 22 November 2019 в 23:38
поделиться

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

2
ответ дан 22 November 2019 в 23:38
поделиться
$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
9
ответ дан 22 November 2019 в 23:38
поделиться

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

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
        )

)
41
ответ дан 22 November 2019 в 23:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: