Я действительно пытаюсь разобраться, как сортировать большой массив.
Массив данных свойств. Есть два важных фрагмента данных, которые мне нужно использовать для упорядочивания массива в порядке. Они есть:
Здесь пример массива
[0]=>
array(8) {
["location"]=>
array(4) {
["street_name"]=>
string(10) "Derby Road"
}
["info"]=>
array(3) {
["status"]=>
string(9) "available"
}
["specs"]=>
array(1) {
["bedroom_number"]=>
string(1) "7"
}
}
Ключ status
можно установить для let
, available
или нескольких других параметров. То, что мне нужно сделать, это сделать любое свойство, которое let
упасть на дно массива, но в порядке уменьшения номера спальни.
Итак, я думаю, что это два правила:
Свойства статуса "Пусть" всегда должны быть самыми низкими в их номере спальни, например:
7 bedroom property - available
7 bedroom property - available
7 bedroom property - let
6 bedroom property - available
7 bedroom property - let
4 bedroom property - available
3 bedroom property - let
Я знаю о существовании usort()
но я просто не уверен, как организовать внутри функции для такого рода аранжировки.
Я думаю, вы можете использовать usort, а затем использовать клавиши массива для сортировки.
Возможно, эта настройка может помочь вам:
$array = array(
array(
"location" => array("street_name" => "Derby Road"),
"info" => array("status" => "available"),
"specs" => array("bedroom_number" => "7")
),
array(
"location" => array("street_name" => "Derby Road"),
"info" => array("status" => "let"),
"specs" => array("bedroom_number" =>"5")
),
array(
"location" => array("street_name" => "Derby Road"),
"info" => array("status" => "let"),
"specs" => array("bedroom_number" =>"7")
),
array(
"location" => array("street_name" => "Derby Road"),
"info" => array("status" => "available"),
"specs" => array("bedroom_number" =>"5")
),
array(
"location" => array("street_name" => "Derby Road"),
"info" => array("status" => "available"),
"specs" => array("bedroom_number" =>"7")
)
);
function cmp($a, $b) {
if ($a["specs"]["bedroom_number"] === $b["specs"]["bedroom_number"]) {
return ($a["info"]["status"] !== "let") ? -1 : 1;
}
return ($a["specs"]["bedroom_number"] > $b["specs"]["bedroom_number"]) ? -1 : 1;
}
usort($array, "cmp");
Вы пробовали функцию array_multisort? вот пример:
<?php
function array_orderby()
{
$args = func_get_args();
$data = array_shift($args);
foreach ($args as $n => $field) {
if (is_string($field)) {
$tmp = array();
foreach ($data as $key => $row)
$tmp[$key] = $row[$field];
$args[$n] = $tmp;
}
}
$args[] = &$data;
call_user_func_array('array_multisort', $args);
return array_pop($args);
}
?>
Сортированный массив теперь находится в возвращаемом значении функции вместо передачи по ссылке.
<?php
$data[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7);
// Pass the array, followed by the column names and sort flags
$sorted = array_orderby($data, 'volume', SORT_DESC, 'edition', SORT_ASC);
?>
function cmp
), которая используется для сортировки. $ a и $ b - это значения, которые он использует для сравнения.