Перестановка массива в зависимости от наличия значения и целого числа

1

Я действительно пытаюсь разобраться, как сортировать большой массив.

Массив данных свойств. Есть два важных фрагмента данных, которые мне нужно использовать для упорядочивания массива в порядке. Они есть:

  • количество спален
  • Статус Доступности

Здесь пример массива

[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 спален должны быть в верхней части списка, а 1 спальня должна быть внизу
  • Свойства статуса "Пусть" всегда должны быть самыми низкими в их номере спальни, например:

    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() но я просто не уверен, как организовать внутри функции для такого рода аранжировки.

Теги:
arrays

2 ответа

2
Лучший ответ

Я думаю, вы можете использовать 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");
  • 0
    Что означает строка «cmp»? Я запутался в том, что вы передаете функции. Откуда поступают $ a и $ b?
  • 0
    Так работает функция php usort . «cmp» - это имя функции (в примере function cmp ), которая используется для сортировки. $ a и $ b - это значения, которые он использует для сравнения.
Показать ещё 1 комментарий
0

Вы пробовали функцию 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);
?>

http://php.net/manual/en/function.array-multisort.php

Ещё вопросы

Сообщество Overcoder
Наверх
Меню