2011-10-31 47 views
3

我有一个混合阵列像这样:数字排序与混合类型值的数组

$fruits = array(
    "lemon", 
    "Lemon", 
    20, 
    "banana", 
    "apple", 
    "121", 
    40, 
    50 
); 

,然后应用sort()功能,如下所示:

sort($fruits, SORT_NUMERIC); 
foreach ($fruits as $key => $val) { 
    echo "fruits[" . $key . "] = " . $val . "\n"; 
} 

现在,我不明白输出即:

fruits[0] = apple 
fruits[1] = lemon 
fruits[2] = banana 
fruits[3] = Lemon 
fruits[4] = 20 
fruits[5] = 40 
fruits[6] = 50 
fruits[7] = 121 

请解释它为什么要按这种方式排序?

+0

混合阵列_actually_包含什么?可能有一种方法来分隔数字和字符串数据。 – Bojangles

+0

这个问题是为了我的好奇在排序()函数 –

回答

2

基本上应该从一种到Z然后通过数字顺序,但使用混合型功能不知道如何对数组进行排序,并给予一个随机的结果...

在手册中

存在巨大的警告说:

当对具有混合类型值的数组进行排序时要小心,因为sort() 可能会产生不可预知的结果。

您可以将参数添加到函数:

  • SORT_REGULAR - 通常比较(不改变类型)

  • SORT_NUMERIC - 比较项目数值

  • SORT_STRING - 比较项目为字符串

  • SORT_LOCALE_STRING - 根据当前语言环境将项目作为字符串进行比较。在PHP 4.4.0和5.0.2中添加,它使用系统区域设置,可以使用setlocale()更改该区域设置。

据手动here上php.net

编辑1: 也许你可以使用标志SORT_REGULAR,因为它不会改变变量的类型和数量仍然号获得最佳排序的结果和弦弦保持,但它也会给你一个奇怪的结果

fruits[0] = 121 
fruits[1] = Lemon 
fruits[2] = apple 
fruits[3] = banana 
fruits[4] = lemon 
fruits[5] = 20 
fruits[6] = 40 
fruits[7] = 50 

我想是因为它〜应变的字母比较ascii码GS和L是前a b l ... 121排在首位,因为你写它像一个字符串"121"

编辑2:

进行的最佳方式是分离的类型:这种方式( PHP将把“121”的号码,而不是一个字符串,但您可以简单地通过if条款决定吧)

<?php 
$fruits = array("lemon","Lemon", 20, "banana", "apple","121",40,50); 
$arr1=array(); 
$arr2=array(); 
     foreach($fruits as $key=>$val){ 
      if (is_numeric($val)) 
       array_push($arr1,$val); 
      else 
       array_push($arr2,$val); 
     }   
sort($arr1,SORT_NUMERIC);    
sort($arr2,SORT_LOCALE_STRING); 
$fruits = array_merge($arr1,$arr2); 
echo "<pre>"; 
foreach ($fruits as $key => $val) { 
    echo "fruits[" . $key . "] = " . $val . "\n"; 
} 
?> 
+0

无论排序标志是什么,它仍然与“柠檬”和“柠檬” – Mob

+0

是啊,我编辑的帖子,在手册页有一个明确警告关于排序混合类型的数组,可能会导致不可预知的结果,我认为是因为函数不知道如何对数组进行排序(按字符串或按数字顺序) – Marcx

+0

我弄糊涂了!!! –

3

OP,因为sort();不大写和小写字符,为什么工作这么好你不把所有东西都转换成小写,然后排序?

<?php 
$fruits = array("lemon","Lemon", 20, "banana", "apple","121",40,50); 
$fruits = array_map("strtolower", $fruits); //using strtolower 

sort($fruits); 
foreach ($fruits as $key => $val) { 
    echo "fruits[" . $key . "] = " . $val . "\n"; 
} 
?> 

输出

fruits[0] = 20 
fruits[1] = 40 
fruits[2] = 50 
fruits[3] = 121 
fruits[4] = apple 
fruits[5] = banana 
fruits[6] = lemon 
fruits[7] = lemon 
1

相信与sort($array, SORT_NUMERIC),这是不能被转换为数字的值被视为0和排序的方式。由于您示例中的所有字符串都变为0,因此柠檬是否在香蕉之前完全没有关系。以下是一个示例:

<?php 
$fruits = array("alpha", "bravo", -1, -0.001, 0, 0.001, 1, "x-ray", "zulu"); 
shuffle($fruits); // randomly re-arrange the items in array 
sort($fruits, SORT_NUMERIC); 
print_r($fruits); 
// output -- pass 1 
Array 
(
    [0] => -1 
    [1] => -0.001 
    [2] => 0 
    [3] => alpha 
    [4] => x-ray 
    [5] => zulu 
    [6] => bravo 
    [7] => 0.001 
    [8] => 1 
) 
// output -- pass 2 
Array 
(
    [0] => -1 
    [1] => -0.001 
    [2] => bravo 
    [3] => zulu 
    [4] => 0 
    [5] => x-ray 
    [6] => alpha 
    [7] => 0.001 
    [8] => 1 
) 
// output -- pass 3 
Array 
(
    [0] => -1 
    [1] => -0.001 
    [2] => x-ray 
    [3] => zulu 
    [4] => 0 
    [5] => bravo 
    [6] => alpha 
    [7] => 0.001 
    [8] => 1 
) 
?>