配列内のキー全体を並べ替えたい。キーと値のペアは多数あり、名前があります。小さい数値では配列が正しくソートされず、数値が大きすぎて整数として格納できない場合はさらに悪化します。整数が大きすぎる場合は、文字列として配列に格納されます。そして、これらの文字列はまったくソートされず、同じ場所に留まります。
私がやりたいのは、キーと値のペアを最大から最小に並べ替えることだけです。ソート機能が完全に失敗するため、その方法がわかりません。
私が得ることができるどんな助けにも感謝します。
これが私のコードです:
<?php
$encodedNames = $_GET['names']; //names array from a html input encoded with JSON.stringify(nameArray);
$names=json_decode($encodedNames); //decode the names
$namesLegacy = (array) NULL; //array that will store key-value pairs (number=>name)
//for each name gets a large number and assigns it as a key
foreach($names as $name){
$name = trim($name);
array_push($namesLegacy, array(getFameNumber($name)=>$name)) ;
}
echo var_dump($namesLegacy) . "<br />";//dumps the array before it is sorted
krsort($namesLegacy);
echo var_dump($namesLegacy) . "<br />";//dumps the array after its sorted
//simply prints each name in a list format
for ($i = 0; $i < sizeof($namesLegacy); $i++) {
$keys = array_values($namesLegacy[$i]);
echo $i+1 .". ".$keys[0] . "<br/>" ;
}
//gets the large number that will become a key and returns it , as a string ?
function getFameNumber($name)
{
$resultTagId = "resultStats";
$name = str_replace(" ", "+", trim($name));
$url='url that will return the large number';
/*can be tested with google url
$url='http://www.google.com/search?q='.$name.'&ie=utf-8&oe=utf-8&aq=t';*/
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec ($ch);
curl_close ($ch);
$dom = new DOMDocument();
@$dom->loadHTML( $data );
$resultsTag = $dom->getElementById($resultTagId)->nodeValue;
$results = preg_replace("/[^0-9]/","",$resultsTag);
return $results;
}
?>
更新: 文字列以外のすべての値が正しくソートされるかどうかをテストするために、さらに例を実行しましたが、そうではないことが判明しました。(以前は機能していましたが、現在は失敗しています)配列があります
array(3) { [0]=> array(1) { [1800000000]=> string(6) "Robert" } [1]=> array(1) { [591000000]=> string(6) "albert" } [2]=> array(1) { [1100000000]=> string(4) "Anna" } }
krsort() を実行すると、返されます
array(3) { [2]=> array(1) { [1100000000]=> string(4) "Anna" } [1]=> array(1) { [591000000]=> string(6) "albert" } [0]=> array(1) { [1800000000]=> string(6) "Robert" } }
これは正しい結果ではありません 正しい結果は 1800000000, 1100000000, 591000000 です
これらの文字列を浮動小数点数に変換しようとしましたが、ほとんどの場合、負の数値として出力されました。だから私は小さなintを文字列に変換する別の方法を試してみましたが、奇妙なことに、それらはすでに文字列でした。配列内でキーと値のペアを形成すると、intに変換されるようです。
誰が何が起こっているのか知っていますか?krsort を間違って使用していますか? 数値が大きすぎるためにまだ問題がありますか?
また、配列に非常に大きな数がある場合の例を示します
array(1) { [0]=> array(1) { ["4430000000"]=> string(3) "son" } }
前の配列では存在しない数字の周りの「」マークに注意してください
更新 2:
わかりましたので、整数の大きさとは何の関係もないことはわかっています。テストするためにこのコードを配置しました$results = substr($results, 0, -3);
が、それでも間違った結果が得られます
array(3) { [2]=> array(1) { [1550]=> string(5) "Reeta" } [1]=> array(1) { [1800000]=> string(6) "Robert" } [0]=> array(1) { [1090000]=> string(4) "Anna" } }
また、キーと値を逆にしてarsort()
、同じ結果で並べ替えを試みました
文字列が配列のキーとして設定されているときに文字列が int に変換される理由を誰かが説明できれば、それも大歓迎です。
ここにkrsortのマニュアルがあります。