2012-03-24 2 views
4
<?php 

    $a = array(
     'a'=>'7833', 
     'd'=>'1297', 
     'c'=>'341', 
     '1'=>'67', 
     'b'=>'225', 
     '3'=>'24', 
     '2'=>'44', 
     '4'=>'22', 
     '0'=>'84' 
    ); 

    ksort($a); 

    print_r($a); 

Приведенный выше код выводит следующий результат.ksort производит неправильный результат при работе с буквенно-цифровыми символами

Array 
(
    [0] => 84 
    [a] => 7833 
    [b] => 225 
    [c] => 341 
    [d] => 1297 
    [1] => 67 
    [2] => 44 
    [3] => 24 
    [4] => 22 
) 

Почему ksort дать неправильный результат?

+1

Что вы считаете результатом ** right **? – salathe

+0

Мне нужно, чтобы индекс отсортировался на основе порядка ASCII-таблицы. –

+0

Где будет '10', между' 1' и '2' или после' 9'? – salathe

ответ

10

Вы должны использовать флаг SORT_STRING. SORT_REGULAR будет сравнивать с текущими типами, в этом случае число 1 приходит после строки «а»:

php -r "echo 1 > 'a' ? 'yes' : 'no';" // yes 
+1

+1 Ты только человек, который ответил на вопрос «Почему ksort дает неправильный результат?» – Wh1T3h4Ck5

+0

@ Wh1T3h4Ck5 нет, его нет. – salathe

+1

@ Wh1T3h4Ck5 Вы правы. Простое решение может помочь решить нашу проблему. Но это не поможет нам улучшить наши навыки программирования. –

1

Попробуйте ksort($a, SORT_STRING), чтобы произвести сравнение строк по клавишам.

-1

Смотрите эту страницу для обзора различных функций сортировки в PHP: http://php.net/manual/en/array.sorting.php

Если вы хотите, отсортированный по ключу, а затем использовать asort(), который производит этот выход:

Array 
(
    [4] => 22 
    [3] => 24 
    [2] => 44 
    [1] => 67 
    [0] => 84 
    [b] => 225 
    [c] => 341 
    [d] => 1297 
    [a] => 7833 
) 
+0

Это не сортировка ключей, сортировка значений. –

7

Сортировка по умолчанию использует SORT_REGULAR.

Принимает значения и сравнивает их, как описано на странице руководства пользователя comparison operators. В случае, когда строковые ключи в вашем примере сравниваются с нулем; эти строки преобразуются в номера (все 0) для сравнения. Если два члена сравниваются как равные, их относительный порядок в отсортированном массиве не определен. (цитируется от usort() manual page.)

Если вы хотите, чтобы отсортированный вывод имел номера перед буквами, вы должны использовать SORT_NATURAL с PHP 5.4. SORT_STRING также сделает работу только, если номера остаются одними цифрами.

SORT_NATURAL (РНР 5.4 или выше) дает ключи заказанное:

0,1,2,4,11,a,b,c 

SORT_STRING дает ключи заказана как:

0,1,11,2,4,a,b,c 

Альтернатива SORT_NATURAL для PHP меньше чем 5.4, будет использоваться uksort().

uksort($a, 'strnatcmp'); 
Смежные вопросы