2012-05-20 2 views
0
function mySort($a, $b) { 
if (strtolower($a->n) == strtolower($b->n)) return 0; 
return (strtolower($a->n) < strtolower($b->n)) ? -1 : 1; 
} 

Это хорошо работает для некоторых данных JSON, как этотPHP JSON декодирования с сортировать по

$txt = '[{"n":"1"},{"n":"2"},{"n":"3"},{"n":"4"},{"n":"5"},{"n":"6"},{"n":"7"},{"n":"8"},{"n":"9"},{"n":"10"},{"n":"11"}] 
$j = json_decode($txt); 
usort($j, 'mySort'); 
foreach ($j as $k=>$v) { 
    echo $v->n.'<br />';//1 2 3 4 5 6 7 8 9 10 11 
} 

Но когда некоторые данные, как это:

$txt = '[{"n":"a 1"},{"n":"a 2"},{"n":"a 3"},{"n":"a 4"},{"n":"a 5"},{"n":"a 6"},{"n":"a 7"},{"n":"a 8"},{"n":"a 9"},{"n":"a 10"},{"n":"a 11"}]'; 
$j = json_decode($txt); 
usort($j, 'mySort'); 
foreach ($j as $k=>$v) { 
    echo $v->n.'<br />';//a 1 a 10 a 11 a 2 a 3 a 4 a 5 a 6 a 7 a 8 a 9 
} 

мне нужно что-то вроде как

a 1 a 2 a 3 a 4 a 5 a 6 a 7 a 8 a 9 a 10 a 11 

Спасибо.

ответ

4

Или даже проще, используйте strnatcmp. Он выполняет естественный порядок и сравнивает элементы таким образом, который кажется естественным для людей.

Пример:

function mySort($a, $b) { 
    return strnatcmp($a->n, $b->n); 
} 
+0

спасибо за это функция. –

+0

Добро пожаловать! –

+0

Я не знал, что это существовало, +1 – Jeroen

1
function mySort2($a, $b) { 
    list ($k, $n) = explode (' ', $a->n); 
    list ($l, $m) = explode (' ', $b->n); 
    if (strtolower($n) == strtolower($m)) return 0; 
    return (strtolower($n) < strtolower($m)) ? -1 : 1; 
} 
$txt = '[{"n":"a 1"},{"n":"a 2"},{"n":"a 3"},{"n":"a 4"},{"n":"a 5"},{"n":"a 6"},{"n":"a 7"},{"n":"a 8"},{"n":"a 9"},{"n":"a 10"},{"n":"a 11"}]'; 
$j = json_decode($txt); 
usort($j, 'mySort2'); 
foreach ($j as $k=>$v) { 
    echo $v->n.'<br />';//a 1 a 10 a 11 a 2 a 3 a 4 a 5 a 6 a 7 a 8 a 9 
} 
+0

это будет сортировать по: а 11 1 10 2 ... –

+0

я заметил, работая над решением этой проблемы прямо сейчас;) – Jeroen

+0

Обновлено, он работает сейчас – Jeroen

Смежные вопросы