2014-10-31 68 views
0

我有一个简单的数组。目标是,按键排序。按键排序数组(键是字符串)

$someUnsortedArray = array("140/142" => "FirstValue", "118/120" => "SecondValue", "122/124" => "ThirdValue", "40/42" => "FourthValue"); 

ksort($someUnsortedArray); 

我的输出:

array (size=4) 
    '118/120' => string 'SecondValue' 
    '122/124' => string 'ThirdValue' 
    '140/142' => string 'FirstValue' 
    '40/42' => string 'FourthValue' 

预期输出:

array (size=4) 
'40/42' => string 'FourthValue' 
'118/120' => string 'SecondValue' 
'122/124' => string 'ThirdValue' 
'140/142' => string 'FirstValue' 

是什么在PHP函数我正在寻找?

回答

5

你可以在这种情况下使用uksort()

$someUnsortedArray = array("140/142" => "FirstValue", "118/120" => "SecondValue", "122/124" => "ThirdValue", "40/42" => "FourthValue"); 

uksort($someUnsortedArray, function($a, $b){ 
    $a = str_replace('/', '', $a); 
    $b = str_replace('/', '', $b); 
    return $a - $b; 
}); 

echo '<pre>'; 
print_r($someUnsortedArray); 
+0

在理论上这是可行的。但有没有更换任何解决方案“ /“没有任何东西? – Tyralcori 2014-10-31 13:18:16

+0

@Tyralcori你需要对它进行自定义排序,因为如果要将它们作为字符串进行比较,你将无法得到所需的值 – Ghost 2014-10-31 13:19:41

+0

@Tyralcori如果你不想要替换,你可能会爆炸它 – Ghost 2014-10-31 13:20:34

2

检查PHP手册:

http://php.net/manual/en/function.ksort.php

使用ksort()SORT_NUMERIC标志。

$someUnsortedArray = array("140/142" => "FirstValue", "118/120" => "SecondValue", "122/124" => "ThirdValue", "40/42" => "FourthValue"); 
ksort($someUnsortedArray, SORT_NUMERIC); 

echo '<pre>'; 
print_r($someUnsortedArray); 

Sample Output

+0

Tyralcori已经尝试过ksort;) – Veve 2014-10-31 13:17:47

+0

那么SORT_NUMERIC – 2014-10-31 13:21:54

+0

“40/42”或“118/120”是不是数字值,它们是字符串。 – Veve 2014-10-31 13:28:04

0

结果预期的行为,因为如果你排序字符串中字母顺序1 *始终是4 *前。

如果你想让它按照数字排序,你必须分割你的字符串,将元素转换为数字并按数字排序。

实施取决于您想要达到的目标。只是一个关键列表?然后你可以迭代一个foreach循环,例如按下键。

不会有“开箱即用”的PHP函数。

2

作为替代方案,你也可以使用自然顺序字符串比较功能来比较键

function sortKey($a, $b) { 
    return strnatcmp($a, $b); 
} 

uksort($someUnsortedArray,"sortKey"); 
0
$someUnsortedArray = array("5/142" => "FirstValue", "118/120" => "SecondValue", "122/124" => "ThirdValue", "40/42" => "FourthValue"); 

uksort($someUnsortedArray, function($a, $b) { 
    // to avoid manipulating them as a string ....  
    return ((float)$a)-((float)$b); 
}); 
var_dump($someUnsortedArray);