今日、私はこの質問の答えを提供し、スクリプトを書きましたが、何かがうまくいかなかったことがわかりました。
これが最初のスクリプトです
<?php
$array = array(
"0" => array (
"id" => 1204,
"custom_price" => 33.1500
),
"1" => array (
"id" => 1199,
"custom_price" => 15.83
),
"2" => array (
"id" => 1176,
"custom_price" => 16.83
)
);
usort($array, function($a, $b) {
return $a['custom_price'] - $b['custom_price'];
});
echo "<pre>";
print_r($array);
その出力は(サンドボックスで出力を確認することもできます)
<pre>Array
(
[0] => Array
(
[id] => 1176
[custom_price] => 16.83
)
[1] => Array
(
[id] => 1199
[custom_price] => 15.83
)
[2] => Array
(
[id] => 1204
[custom_price] => 33.15
)
)
したがって、希望する出力は(custom_price 15.83, 16.83, 33.15000
)のようになりますが、実際の出力は(custom_price 16.83,15.83,33.15000
)です。15.83が16.83から最小であることがわかります。ソート結果が間違っている
したがって、custom_price 15.83を14.83に変更すると、出力の並べ替えは正しくなります
<pre>Array
(
[0] => Array
(
[id] => 1199
[custom_price] => 14.83
)
[1] => Array
(
[id] => 1176
[custom_price] => 16.83
)
[2] => Array
(
[id] => 1204
[custom_price] => 33.15
)
)
何が起こっているのか理解できません。これについて何か考えはありますか?
私の質問は次のとおりです。各反復をチェックしますが、問題を特定できません。custom_priceが15.83の場合、結果は間違っています。どうして?
usort()
比較関数からの戻り値に関する警告がPHPマニュアルにあります(http://php.net/manual/en/function.usort.php#refsect1-function.usort-parameters)...
注意floatなどの比較関数から非整数値を返すと、コールバックの戻り値の整数への内部キャストが発生します。したがって、0.99や0.1などの値は両方とも0の整数値にキャストされ、等しい値として比較されます。
また、PHP 7から<=>
、2つの値の比較に応じて1、0、-1を返す宇宙船演算子を使用できます。
usort($array, function($a, $b) {
return $a['custom_price'] <=> $b['custom_price'];
});
echo "<pre>";
print_r($array);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加