На основании ответа Томаса Уотнедала. Тем не менее, это точно не отвечает на прямую часть исходного вопроса. Функция может по-прежнему заменяться по принципу «строка-строка»
. Эта реализация заменяет содержимое файла без использования временных файлов, поскольку в результате права на файлы остаются неизменными.
Также 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()
Вы правы, вам нужна функция 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);
попробуйте следующее:
asort($array_to_sort, SORT_NUMERIC);
для справки см. Это: http://php.net/manual/en/function.asort.php
см. Здесь различные флаги сортировки: http://www.php.net/manual/en/function.sort.php
Вы можете попробовать определить свою собственную функцию сравнения, а затем использовать usort .
$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
Поскольку ваши элементы массива сами являются массивами со строковыми ключами, лучше всего определить настраиваемую функцию сравнения. Сделать это довольно быстро и легко. Попробуйте следующее:
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
)
)