2012-03-07 96 views
1

我有與正在對飛聲明的一些值的數組:排序多維陣列的PHP

// a for loop that finds elements from source 
$array[] = array($fruit, $color, $shape, $price); 

後我還有一個for循環,其顯示陣列中的項目:

for($j = 0; $j < sizeof($array); $j++) { 
    echo $array[$j][0]." ".$array[$j][1]." ".$array[$j][2]." ".$array[$j][3]." 
      ".$array[$j][4]; 
} 

我能夠正確顯示所有我想要的信息,但是我想根據$價格對數組進行排序。例如

Orange orange round £.6 
Mango yellow oval £.9 
Apple red round £.4 

我想在下面的表格

Apple red round £.4 
Orange orange round £.6 
Mango yellow oval £.9 

使用uasort: 前:

Array ([0] => Array ([0] => Orange [1] => red [2] => round [3] => .6) 
     [1] => Array ([0] => Mango [1] => yellow [2] => oval [3] => .9) 
     [2] => Array ([0] => Apple [1] => red [2] => round [3] => .4)); 

功能提供:

function my_cmp_func($a, $b) { 
    if($a[3] == $b[3]){ 
     return -1*strcmp($a[4], $b[4]); // another column added for comparison 
    } 
    return -1*strcmp($a[3], $b[3]);  
} 

uasort($array, 'my_cmp_func'); 
print_r($array); 
+0

在全國有一堆例子:HTTP:// PHP .net/manual/en/function.array-multisort.php – Ynhockey 2012-03-07 14:31:21

回答

3

你可以做,使用自定義比較函數

所以你使用usort功能(如果你不需要保留索引)開始 所以你會這樣稱呼它:

usort($array, 'my_cmp_func'); 

,並定義爲比較功能:

function my_cmp_func($a, $b) 
{ 
    return strcmp($a[3], $b[3]);  
} 

我用的strcmp,因爲我不知道如果英鎊SI定義的函數gn是價值的一部分,或者您現在只需添加它。但你可以定義你想要的功能

編輯:我在這裏添加了樣本http://codepad.org/DxgFznzE以顯示它的工作原理;如果你想反向排序只是在功能使用:

return -1*strcmp($a[3], $b[3]); 

而不僅僅是你的strcmp

+0

,如果你需要保持索引關係,你可以使用一個非常類似的函數調用uasort(http://www.php.net/manual/en/function。 uasort.php) – mishu 2012-03-07 14:36:24

+0

我確實需要保持索引。否則,我將失去相關的值。 – Namit 2012-03-07 14:58:42

+0

@Namit它是完全一樣的東西,但你需要使用uasort而不是usort .. – mishu 2012-03-07 15:00:07

1

如果我是假設編碼這個。我想做另一個數組。哪些在排序後會收到價值。

然後我會顯示輸出。 我會建議冒泡排序對此很簡單。

乾杯!

一個例子會是這樣的

$numbers = array(1,3,2,5,2); 
$array_size = count($numbers); 
echo "Numbers before sort: "; 
for ($i = 0; $i < $array_size; $i++) 
    echo $numbers[$i]; 
echo "n"; 
for ($i = 0; $i < $array_size; $i++) 
{ 
    for ($j = 0; $j < $array_size; $j++) 
    { 
     if ($numbers[$i] < $numbers[$j]) 
     { 

    //all the swapping variable here..... 
     $temp = $numbers[$i]; 
     $numbers[$i] = $numbers[$j]; 
     $numbers[$j] = $temp; 
     } 
    } 
} 

echo "Numbers after sort: "; 
for($i = 0; $i < $array_size; $i++) 
    echo $numbers[$i]; 
echo "n"; 
+0

我明白你的意思,但讓我拿我的例子,並應用這種情況。一旦一切都被排序。不會把整個桌子搞亂,不會改變水果的價格。我認爲這將簡單地對價格欄進行排序,但不會改變其他欄的位置。我需要一種讓價格成爲關鍵並改變整個行的方法。希望你能理解! :s – Namit 2012-03-07 14:49:51

+0

哦,是的,我得到你。類似於Excel中提供的排序功能。 當你排序的東西整個表(值)與您的關鍵列一起排序。那是你所指的? – MDMalik 2012-03-07 14:52:22

+0

這正是我的意思,但是你說的上述方法讓我這麼做? – Namit 2012-03-07 14:55:27

0

儲存於一個associative array,這將允許您使用價格作爲重點,容易按鍵的升序打印的項目。

0

如果您不打算重複價格,請使用價格作爲數組的關鍵字。像:

$array[$price] = array($fruit, $color, $shape, $price); 

然後排序鍵:

ksort($array); 

然後做你的輸出。

如果您有重複的價格,您可以使用array_walk或array_multisort。

0

獲得價值之前,你的for循環就叫array_multisort($array);

array_multisort()可以做很多有用的東西排序 - 在這裏看到的細節 - http://www.php.net/manual/en/function.array-multisort.php

此外,您的for循環可以作爲簡化 -

foreach($array as $a) { 
    echo $a[0] . " " . $a[1] . " " . $a[2] . " " . $a[3]; 
} 
+0

它對第一列執行排序操作。 – Namit 2012-03-07 14:39:27