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

これは、このような一部の 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

2 に答える 2

4

またはさらに簡単に、strnatcmpを使用します。自然な順序付けを実行し、人間にとって自然に見える方法で要素を比較します。

例:

function mySort($a, $b) {
  return strnatcmp($a->n, $b->n);
}
于 2012-05-20T21:19:29.513 に答える
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
}
于 2012-05-20T21:09:27.307 に答える