PHPにおけるusortは値相と同時に元の位置問題の解決方法を変える。

1946 ワード

PHP 4.1.0以降、usortは比較値と同時に元の位置が変わる可能性があります。文書では、If two members compare as equal、their order in the sorted array undefinedと言います。つまり、比較した2つの値が同じなら、並べ替えの結果の順序はランダムです。同じ値の元の位置を維持する必要がある場合は、本明細書の方法を参照することができる。デモンストレーションデータ:
 
<?php
/*
PHP usort
:Artlover http://www.CodeBit.cn
*/
$arr = array(
array('a' => 5, 'b' => 3),
array('a' => 5, 'b' => 1),
array('a' => 5, 'b' => 4),
array('a' => 5, 'b' => 2),
);
?>
配列の最初の要素の値は同じであり、期待される結果は、既存の位置をそのまま維持することである。すなわちbの順序は3、1、4、2はusortで並べ替えられ、比較フィールドの値が同じである場合、元の順序は
 
<?php
/*
PHP usort
:Artlover http://www.CodeBit.cn
*/
$callback = create_function('$a,$b', 'return ($a["a"] == $b["a"])?0:(($a["a"] > $b["a"]) ? 1 : -1);');
usort($arr, $callback);
?>
の結果を変更することができる。しかし、usortは配列全体の順序を混乱させました。比較した値が同じ時に元の位置を維持するには、array_を使うことができます。multiisort:
 
Array
(
[0] => Array
(
[a] => 5
[b] => 2
)
[1] => Array
(
[a] => 5
[b] => 4
)
[2] => Array
(
[a] => 5
[b] => 1
)
[3] => Array
(
[a] => 5
[b] => 3
)
)
結果:
 
<?php
/*
PHP usort
:Artlover http://www.CodeBit.cn
*/
//
$i = 0;
// 2 , ,
$a = $index = array();
foreach ($arr as $key => $data) {
$a[$key] = $data['a'];
$index[] = $i++;
}
// ,
array_multisort($a, SORT_ASC, $index, SORT_ASC, $arr);
?>