2013-03-24 217 views
1

如何排序人類(自然排序)在php中的關聯數組?如何排序人類(自然排序)在php中的關聯數組?

以下代碼:

<?php 

$notSorted = array( 
array('Title' => 'rose', 
'Price' => 1.25, 
'Number' => '10' 
), 
array('Title' => 'daisy', 
'Price' => 0.75, 
'Number' => '1', 
), 
array('Title' => 'orchid', 
'Price' => 1.15, 
'Number' => '7' 
) 
); 

//我敢打賭,排序是要在這裏occure

foreach ($notSorted as $val) 
    echo $val['Number'], " - "; 

?> 

將會輸出: 10 - 1 - 7

而如何'人數'排序(對於人類)?像: 1 - 7 - 10

另外如果'數字'是一個整數,如果它是一個字符串呢?

回答

0

字段「數字」是字符串,所以它被字符比較,不是千位數,而是數百位等等。

您可以編寫自己的排序功能,並與usort使用或使用sortSORT_NUMERIC,也許array_multi_sort

0

您可以通過這種方式嘗試:

<?php 

function record_sort($records, $field, $reverse=false) 
{ 
    $hash = array(); 

    foreach($records as $record) 
    { 
     $hash[$record[$field]] = $record; 
    } 

    ($reverse)? krsort($hash) : ksort($hash); 

    $records = array(); 

    foreach($hash as $record) 
    { 
     $records []= $record; 
    } 

    return $records; 
} 

// Example below 

$airports = array 
(
    array("code" => "LHR", "name" => "Heathrow"), 
    array("code" => "LGW", "name" => "Gatwick"), 
); 

printf("Before: <pre>%s</pre>", print_r($airports, true)); 

$airports = record_sort($airports, "name"); 

printf("After: <pre>%s</pre>", print_r($airports, true)); 

?> 

Example Outputs: 

Before: Array 
(
    [0] => Array ([code] => LHR, [name] => Heathrow) 
    [1] => Array ([code] => LGW, [name] => Gatwick) 
) 

After: Array 
(
    [0] => Array ([code] => LGW, [name] => Gatwick) 
    [1] => Array ([code] => LHR, [name] => Heathrow) 
) 

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

0

如果Number字段是一個整數(或浮動),您可以只使用array_multisort,並指定要作爲排序依據Number字段。 http://php.net/manual/en/function.array-multisort.php文檔中的示例#3向您展示瞭如何爲關聯數組執行此操作。

如果Number是一個字符串,事情會更加困難 - 在這種情況下,您必須進行「自然」排序,以確保「7」在「10」之前。如果您使用PHP 5.4或更新版本,則可以使用array_multisortSORT_NATURAL標誌。 如果您使用的是比PHP 5.4更早的東西,則可能需要使用usortstrnatcmp。有關如何執行此操作的詳細信息,請參見https://stackoverflow.com/a/11315019/26311