Учитывая массив массивов, как мне естественным образом отсортировать внутренние массивы на основе их значений?

Пример массива:

array (size=2)
  0 => 
    array (size=1)
      'manager' => string 'Manager 1' (length=9)
  1 => 
    array (size=1)
      'manager' => string 'Manager 3' (length=9)

Другой пример массива:

array (size=2)
  0 => 
    array (size=1)
      'month' => string 'June' (length=4)
  1 => 
    array (size=1)
      'month' => string 'January' (length=7)

Моя первая идея заключалась в том, чтобы просто natsort() их, но это предполагает нормальный массив. Следующей идеей было использовать array_multisort($array, SORT_NATURAL);, но это не сработало из-за ассоциативных массивов.

Итак, как мне отсортировать внутренние массивы, используя естественную сортировку? Кроме того, в этом случае не имеет значения сохранение ключей массива.

РЕДАКТИРОВАТЬ:

Ожидаемый результат массива 1 будет таким же (поскольку Менеджер 1 и Менеджер 3 уже в порядке):

array (size=2)
  0 => 
    array (size=1)
      'manager' => string 'Manager 1' (length=9)
  1 => 
    array (size=1)
      'manager' => string 'Manager 3' (length=9)

Ожидаемый результат массива 2 поставит январь перед июнем («естественный» порядок):

// 0 and 1 keys can switch or stay the same, doesn't matter
array (size=2)
  0 => 
    array (size=1)
      'month' => string 'January' (length=4)
  1 => 
    array (size=1)
      'month' => string 'June' (length=7)
6
Samsquanch 4 Фев 2015 в 19:11

3 ответа

Лучший ответ

Что ж! Вы можете упростить функцию, используя следующие функции естественной сортировки:

usort($array, function($a, $b){
    return strnatcmp($a['manager'],$b['manager']); //Case sensitive
    //return strnatcasecmp($a['manager'],$b['manager']); //Case insensitive
});
18
rub3ns 4 Фев 2015 в 16:55

Вы можете использовать usort () и написать свою собственную функцию сравнения. Я начал с вашего примера массива, а затем изменил индексы на строки, чтобы убедиться, что он работает. Я тестировал его тремя способами, и все они работали, включая array_multisort (если вы не заботитесь о ключах, как вы сказали).

# Quick, dirty, and probably not suitable for any use, anywhere, by anyone
$test1 = array();
$test1["zero"]="June";
$test1["one"] ="January";

function nat_cmp($a,$b){
        return strnatcmp($a,$b);
}

#usort($test1, 'nat_cmp'); # Returns {0=>"January",1=>"June"}
#usort($test1, function($a,$b){return strnatcmp($a,$b);}); # Same
array_multisort($test1, SORT_ASC, SORT_NATURAL); #Same

var_dump($test1);

(NB: если вам в конечном итоге понадобятся ключи, вам обязательно придется перейти по настраиваемому свернутому пути с помощью array_keys или uksort ())

0
GeminiDomino 4 Фев 2015 в 16:57

usort() PHP позволяет определять пользовательскую функцию обратного вызова для сортировки :

usort($array, function($a, $b){
    if ($a['manager'] == $b['manager']) {
        return 0;
    }
    return ($a['manager'] < $b['manager']) ? -1 : 1;
});

Для сортировки месяцев вы можете использовать что-то вроде date('m', strtotime($a['month'])), чтобы получить номер месяца для сравнения. Дополнительные способы сделать это можно найти здесь: преобразовать месяц из названия в число

1
Community 23 Май 2017 в 12:07