我想在数组中对整串键进行排序。键值对具有大量和名称。它在小数字上对数组排序不正确,当数字太大而无法存储为整数时,它会变得更糟。如果整数太大,则它们将作为字符串存储在数组中。而那些字符串根本不会排在同一个地方。
我想要做的就是将键值对从最大到最小排序。 由于排序功能完全失败,我不知道该怎么做 我会感激任何帮助。
这是我的代码:
<?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" } }
这不是正确的结果,正确的结果是 18亿, 11亿, 5.91亿
我试图将这些字符串转换为浮点数,但它主要使它们成为负数。所以我尝试了另一种方式将小的int转换为字符串,但奇怪的是它们已经是字符串了。当我在数组中形成键值对时,似乎它们被转换为整数。
有谁知道发生了什么事?我使用krsort错误是问题仍然是因为数字太大了?
我还会给出一个例子,说明当我在数组中有一个非常大的数字
时的样子array(1) { [0]=> array(1) { ["4430000000"]=> string(3) "son" } }
注意前面数组中不存在的数字周围的“”标记
UPDATE2:
好的,所以我知道它与整数有多大无关。
我放置了这段代码来测试它$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手册。
答案 0 :(得分:0)
尝试
$key = getFameNumber($name);
array_push($namesLegacy, array("$key"=>$name)) ;