2012-03-07 98 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