Вопрос по php – Сортировка многомерного массива, верхний регистр сортируется перед строчным

1

Использование ниже для сортировки многомерного массива по отображаемому имени:

<code>$sortArray = array();

foreach($members as $member){
    foreach($member as $key=>$value){
        if(!isset($sortArray[$key])){
            $sortArray[$key] = array();
        }
        $sortArray[$key][] = $value;
    }
}

$orderby = "screen_name";

array_multisort($sortArray[$orderby],SORT_ASC,$members);
</code>

Но заглавные буквы сортируются перед строчными:

Allan Brenda Greg работает

НоFrank приходит раньшеdan

Существует много способов сортировки массивов, но я, наконец, получил это с помощью описанного выше, хотел посмотреть, есть ли простой способ исправить это?

Ваш Ответ

2   ответа
1

uasort () должен работать на вас


// custom sort function
function sort_by_screen_name($a, $b) {

    // compare using lowercase strings only
    $a = strtolower($a['screen_name']);
    $b = strtolower($b['screen_name']);

    if ($a == $b) {
        return 0;
    }

    return ($a < $b) ? -1 : 1;
}

$members = array(
    array('screen_name'=>'Greg'),
    array('screen_name'=>'Allen'),
    array('screen_name'=>'dan'),
    array('screen_name'=>'Brenda'),
);

// uasort() like a boss!
uasort($members, 'sort_by_screen_name');

print_r($members);

Выход

Array
(
    [1] => Array
        (
            [screen_name] => Allen
        )

    [3] => Array
        (
            [screen_name] => Brenda
        )

    [2] => Array
        (
            [screen_name] => dan
        )

    [0] => Array
        (
            [screen_name] => Greg
        )

)

Примечание: оригинальные ключи массива сохраняются с использованием этого метода. Если вы хотите, чтобы ключи были переписаны, вы можете просто использоватьusort().

1

usort() и пользовательская функция сортировки. Вы можете изменить эти данные, если хотите посмотреть, насколько они соответствуют вашим собственным данным:http://codepad.org/b89HwmbM

$members = array(
  array( "loc" => "Ontario",   "first" => "Bob",  "screen_name" => "fooArt" ),
  array( "loc" => "Atlanta",   "first" => "Sal",  "screen_name" => "TIMMY!" ),
  array( "loc" => "Panama",    "first" => "Mick", "screen_name" => "Analog" ),
  array( "loc" => "Pensacola", "first" => "A",    "screen_name" => "Franky" ),
  array( "loc" => "McPherson", "first" => "Anna", "screen_name" => "annie9" )
);

usort( $members, 'custom_sort' );

function custom_sort( $m1, $m2 ){
  return strtolower( $m1['screen_name'] ) > strtolower( $m2['screen_name'] );
};

Результат этого метода сортировки следующий:

Array
(
    [0] => Array
        (
            [loc] => Panama
            [first] => Mick
            [screen_name] => Analog
        )

    [1] => Array
        (
            [loc] => McPherson
            [first] => Anna
            [screen_name] => annie_23
        )

    [2] => Array
        (
            [loc] => Ontario
            [first] => Bob
            [screen_name] => fooArt
        )

    [3] => Array
        (
            [loc] => Pensacola
            [first] => A
            [screen_name] => Franky
        )

    [4] => Array
        (
            [loc] => Atlanta
            [first] => Sal
            [screen_name] => TIMMY!
        )

)
Это действительно не помогает продемонстрироватьusortспособность обрабатывать многомерные массивы.
@macek Вы правы. Обновлено.

Похожие вопросы