PHP - проблема с сортировкой моего многомерного массива? - PullRequest
2 голосов
/ 25 апреля 2019

У меня есть многомерный массив, который выглядит так:

enter image description here

array:3 [
  0 => array:2 [
    "titre" => "Un package test"
    "nbDDL" => "3"
  ]
  1 => array:2 [
    "titre" => "retest"
    "nbDDL" => "1"
  ]
  2 => array:2 [
    "titre" => "ytjrtj"
    "nbDDL" => "1"
  ]
]

Я бы хотел отсортировать его в порядке ASC или DESC (в зависимости от переменной, переданной в параметре функции) с помощью nbDDL.

Я посмотрел на метод array_multisort(), но не могу поставить его на место.

Я работаю под Symfony 3. В настоящее время у меня есть:

if($ordreTri == "ASC")
{
    $liste = array_multisort("nbDDL", ASC);
}

Спасибо за вашу помощь!

Ответы [ 3 ]

2 голосов
/ 25 апреля 2019

Есть несколько различных способов сделать это - вы можете ввести собственную сортировку, используя usort() и оператор космического корабля <=>, но вы можете использовать array_multisort(), вам просто нужно объединить это с array_column().

Вы можете отсортировать массив, сначала загрузив все nbDDL s.Затем используйте это как массив сортировки в array_multisort() и сортируйте по возрастанию (SORT_ASC).Примените это к $array, и все готово!

// By reference, $array is changed
array_multisort(array_column($array, "nbDDL"), SORT_ASC, $array);

Это сделано по ссылке, поэтому вам не нужно присваивать его переменной.Возвращаемое значение array_multisort() является логическим значением, что означает, что если вы назначите его как

// By reference - $result is bool
$result = array_multisort(array_column($array, "nbDDL"), SORT_ASC, $array);

, тогда $result будет либо истинным, либо ложным, но не отсортированным массивом.

1 голос
/ 25 апреля 2019

Вы можете сделать следующим образом:

function array_sort($array, $on, $order=SORT_ASC){

    $new_array = array();
    $sortable_array = array();

    if (count($array) > 0) {
        foreach ($array as $k => $v) {
            if (is_array($v)) {
                foreach ($v as $k2 => $v2) {
                    if ($k2 == $on) {
                        $sortable_array[$k] = $v2;
                    }
                }
            } else {
                $sortable_array[$k] = $v;
            }
        }

        switch ($order) {
            case SORT_ASC:
                asort($sortable_array);
                break;
            case SORT_DESC:
                arsort($sortable_array);
                break;
        }

        foreach ($sortable_array as $k => $v) {
            $new_array[$k] = $array[$k];
        }
    }

    return $new_array;
}

Использовать функцию как:

$list = array(
   array( 'type' => 'suite', 'name'=>'A-Name'),
   array( 'type' => 'suite', 'name'=>'C-Name'),
   array( 'type' => 'suite', 'name'=>'B-Name')
 );

$list = array_sort($list, 'name', SORT_ASC);
1 голос
/ 25 апреля 2019

Вы можете попробовать, как показано ниже:

$data = [
    ['a' => 'a', 'order' => 1],
    ['b' => 'b', 'order' => 3],
    ['c' => 'c', 'order' => 1]
];

array_multisort(array_column($data, 'order'), SORT_DESC, SORT_NUMERIC, $data);

print_r($data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...