我想对数组中的所有键进行排序。键值对是一个大数字和一个名称。它在小数字上对数组进行错误排序,当数字太大而无法存储为整数时,情况会变得更糟。如果整数太大,它们将作为字符串存储在数组中。而且这些字符串根本不会排序留在同一个地方。
我要做的就是将键值对从最大到最小进行排序。我不知道该怎么做,因为排序功能完全失败。
我会很感激我能得到的任何帮助。
这是我的代码:
<?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
我试图将这些字符串转换为浮点数,但它主要使它们以负数出现。所以我尝试以另一种方式将小整数转换为字符串,但奇怪的是它们已经是字符串。当我在数组中形成键值对时,它们似乎被转换为整数。
有人知道发生了什么吗?我是否错误地使用了 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()
使用相同的结果进行排序
如果有人能解释为什么字符串在被设置为数组中的键时会转换为整数,那也将不胜感激。
这是krsort手册。