2012-02-20 167 views
2

首先,是的,這是一個重複的問題,在這裏已經被問了100次,並且我已經閱讀了很多帖子,但是給出的示例並不工作100 %對我來說,我無法弄清楚我要去哪裏錯了。PHP排序多維數組,只能對一列進行排序

我想通過'distance'鍵對這樣一個數組進行排序,並且我希望排序在整個數組中被「擴展」,以便重新排列數組中的所有鍵。本質上,就像您在電子表格中對列進行排序並在所有列上擴展排序一樣。

這裏的樣品陣列:

$locations = array ( 
[phone] => Array ( 
    [0] => 555-123-1234 
    [1] => 555-456-4321 
    [2] => 555-789-1122 
    [3] => 555-321-1111) 
[address] => Array ( 
    [0] => 123 Main Street BigCity, NY 12345 
    [1] => 456 Maple Street Somewhere, UT 87654 
    [2] => 999 1st Ave MyTown, VA 23456 
    [3] => 321 2nd Ave MyTown, VA 23456) 
[distance] => Array ( 
    [0] => 24.56 
    [1] => 13.05 
    [2] => 23.99 
    [3] => 1.75) 
[name] => Array ( 
    [0] => First Location 
    [1] => Second Location 
    [2] => Third Location 
    [3] => Fourth Location) 
) 

我試圖用「距離」的數組排序,我同時使用在array_multisort()函數和usort()函數試圖...但只有「multisort」通過僅對距離進行排序而不是根據距離對整個陣列進行排序,可以給我幾乎可用的結果。

我的功能:

array_multisort($locations['distance'], SORT_NUMERIC); 

我然後運行一個「for」循環遍歷數組和關鍵吐出值。結果是距離是有序的,但地點名稱,地址等不會被重新排序。

我在這裏錯過了什麼?

謝謝!

回答

3

您的數組按列排列,而array_multisort()以這種方式使用時期望它按行排列。

它應該是,如果你這樣做,你會得到的結構:

$rows = array(); 
while ($row = $result->fetch_assoc()) $rows[] = $row; 

...帶庫MySQLi結果對象。

可以重新格式化您現有的陣列到這個結構很容易:

$locationsAsRows = array(); 
for ($i = 0; isset($locations['phone'][$i]); $i++) { 
    $locationsAsRows[$i] = array (
    'phone' => $locations['phone'][$i], 
    'address' => $locations['address'][$i], 
    'distance' => $locations['distance'][$i], 
    'name' => $locations['name'][$i] 
); 
} 
var_dump($locationsAsRows); 

現在,當你這樣做:

array_multisort($locations['distance'], SORT_NUMERIC, $locationsAsRows); 
var_dump($locationsAsRows); 

...你可以看到數據已排序。請注意,我不僅傳遞了要排序的列數據,還將整行「行格式」$locationsAsRows數組作爲最後一個參數。這是通過引用傳遞的,所以$locationsAsRows本身將在您調用array_multisort()後成爲排序數據。

現在讓我們假設兩個distance值是相同的 - 我們需要提供第二個優先搜索列。所以接下來,我們可以通過address排序,我們能做到這一點,像這樣:

array_multisort($locations['distance'], SORT_NUMERIC, $locations['address'], SORT_ASC, $locationsAsRows); 

See it working與它周圍有一齣戲......

+0

感謝偉大的解釋和例子!我猜想我不瞭解的部分是這些函數如何看待數組。但是,在使用你的例子時,我不得不按行排序我想要的所有列。我不確定這是爲什麼,但如果我在multisort函數中添加所有行,它將起作用。任何想法爲什麼這可能是? – gtr1971 2012-02-21 15:42:50

+0

'array_multisort()'可以用很多方式使用,但是這個選項的行爲大致類似於SQL查詢中的'order by'子句。而在SQL中,你總是處理行。您必須傳遞要按(列)排序的數據集,以便知道如何對數據進行排序,然後將整個數據集作爲最後一個參數傳遞,以便可以根據這些規則對數據集進行排序。所以它就像'SELECT phone,address,distance,name FROM locations ORDER BY distance' – DaveRandom 2012-02-21 17:26:11

+0

這相當於'SELECT phone,address,distance,name FROM locations ORDER BY distance,address,name,phone' - each additional pair of完整數據集「$ locationsAsRows」之前的'$ col,SORT_CONST'值與'ORDER BY'子句的另一個級別相似。所以'$ locations ['phone'],SORT_ASC'可能永遠不會到達,除非兩個記錄的'distance','address'和'name'具有完全相同的值。 – DaveRandom 2012-02-22 15:25:38

0
array_multisort($locations['distance'],$locations['name'],$locations['address'],$locations['phone'],SORT_NUMERIC); 

也許這會做這項工作嗎?