2012-03-07 2 views
1

я есть массив с некоторыми значениями, которые в настоящее время объявленных на лету:сортировки мульти-х мерном массиве PHP

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

позже я есть другой цикл, который отображает элементы в массиве:

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

Есть куча примеров по адресу: // PHP .net/manual/en/function.array-multisort.php – Ynhockey

ответ

3

вы можете сделать это с помощью пользовательской функции сравнения

так что вы начинаете с помощью функции usort (если вам не нужно, чтобы индексы) так вы будете называть это так:

usort($array, 'my_cmp_func'); 

и определить функцию сравнения, как:

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

Я определил функцию с помощью STRCMP, потому что я, если фунт си не знаю 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

+0

Мне нужно сохранить индексы. В противном случае я потеряю связанные значения. – Namit

+0

@Namit это то же самое, но вам нужно использовать uasort вместо usort. – mishu

1

Если я был предположить, чтобы код этого ,

Я бы сделал еще один массив. Который получил бы значение после сортировки.

И тогда я бы отобразил вывод. Я бы предложил, чтобы сортировка пузыря была достаточно простой для этого.

Cheers!

Одним из примера будет что-то вроде этого

$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

+0

О, да, я понимаю. Подобно функции сортировки, предусмотренной в excel. Когда вы сортируете что-то, вся таблица (значения) сортируется вместе с вашим ключевым столбцом. Это то, что вы имеете в виду? – MDMalik

+0

Это именно то, что я имею в виду, но высказал ли этот метод выше, позволенный мне сделать это? – Namit

0

храните его в associative array, что позволит вам использовать цену в качестве ключа и легко печатать элементы в порядке возрастания ключа.

0

Если у вас нет повторных цен, используйте цену в качестве ключа массива. Как:

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

Затем сортировать по клавишам:

ksort($array); 

Затем сделайте свой вывод.

Если у вас будут повторяющиеся цены, вы, вероятно, можете использовать array_walk или array_multisort.

0

Просто позвоните array_multisort($array);, прежде чем ваш цикл.

array_multisort() может сделать много полезной сортировки вещей - подробнее здесь - http://www.php.net/manual/en/function.array-multisort.php

Кроме того, ваш цикл может быть упрощена -

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

Выполняет операцию сортировки в первом столбце. – Namit

Смежные вопросы