[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сортировака многомерного массива
ManManovich
есть массив:

Array ( 
[
0] => Array ( [id] => 101 [pagetitle] => Рави Шанкар [alias] => ravi-shankar [menutitle] => [longtitle] => Рави Шанкар / Ravi Shankar - 34 альбома (mp3) [createdon] => 1257172690 )
[
1] => Array ( [id] => 77 [pagetitle] => Pandit Hari Prasad Chaurasia [alias] => pandit-hari-prasad-chaurasia [menutitle] => [longtitle] => Pandit Hari Prasad Chaurasia (15 CDs) Бамбуковая флейта [createdon] => 1251959036 )
[
2] => Array ( [id] => 63 [pagetitle] => Maharishi Gandharva [alias] => maharishi-gandharva [menutitle] => [longtitle] => Maharishi Gandharva [createdon] => 1251780290 )
[
3] => Array ( [id] => 115 [pagetitle] => Prapannam das [alias] => [menutitle] => [longtitle] => Prapannam das - 2 albums [createdon] => 1270548468 )
[
4] => Array ( [id] => 114 [pagetitle] => Wah! [alias] => [menutitle] => [longtitle] => Wah! 5 cd [createdon] => 1270543695 )
[
5] => Array ( [id] => 108 [pagetitle] => Anoushka Shankar [alias] => anoushka-shankar [menutitle] => [longtitle] => Anoushka Shankar - дискография [createdon] => 1263208779 )
[
6] => Array ( [id] => 68 [pagetitle] => Jagjit Singh [alias] => agjit-singh [menutitle] => [longtitle] => Jagjit Singh - Devotional Music [createdon] => 1251829511 )
[
7] => Array ( [id] => 67 [pagetitle] => Maneesh de Moor [alias] => maneesh-de-moor [menutitle] => [longtitle] => Maneesh de Moor 3 albums (320) [createdon] => 1251783927 )
[
8] => Array ( [id] => 35 [pagetitle] => Satyaa & Pari [alias] => satyaa-pari [menutitle] => [longtitle] => Satyaa & Pari [createdon] => 1238842294 )
[
9] => Array ( [id] => 30 [pagetitle] => Dana Gillespie - Third Man [alias] => dgtm [menutitle] => [longtitle] => Dana Gillespie - Third Man [createdon] => 1238585374 )
[
10] => Array ( [id] => 29 [pagetitle] => Маниш Вьяс [alias] => manish-vyas [menutitle] => [longtitle] => Маниш Вьяс [createdon] => 1238580757 )
[
11] => Array ( [id] => 23 [pagetitle] => Nina Hagen [alias] => nina [menutitle] => [longtitle] => Nina Hagen - Om namah Shivay! 2CD [createdon] => 1238511957 )
[
12] => Array ( [id] => 14 [pagetitle] => Bhagavan Das [alias] => bhagavan-das [menutitle] => [longtitle] => Bhagavan Das [createdon] => 1238323987 )
[
13] => Array ( [id] => 13 [pagetitle] => Кришна Дас [alias] => krishna-das [menutitle] => [longtitle] => Кришна Дас [createdon] => 1238320019 ) )


Мне нужно его отсортировать по параметру createdon. Вложенные массивы где это значение больше , те в начало.

Я видел тему на форуме, но только ни черта не понял.

Старая тема о сортировка многомерного массива

Там есть код:

function cmp($a, $b){
if($a['Symbol'] == $b['Symbol']){
return 0;
}
return ($a['Symbol'] < $b['Symbol']) ? -1 : 1;
}
usort($last, "cmp");


Я не понимаю откуда взялись $a, $b и $last, и как туда попадают значения. И ещё не понимаю что делает "? -1 : 1;". так как тема 2008 года поднимать не стал, а создал новую.

Если кто-то может объясните чайнику поподробнее, пожалуйста, как мне выполнить мою задачу.



Спустя 47 минут, 59 секунд (28.07.2010 - 18:53) Nord написал(а):
Ф-ция usort для каждой пары элемнтов массива $last вызывает функцию cmp($a, $b), где $a и $b - пара значений массива.

Соответено это ф-ция должна возвращать:
-1, если элемент $a должен стоять раньше $b ($a < $b)
0, если элементы $a и $b равны
1, если элемент $a должен стоять позже $b ($a > $b)

Подробнее о ф-ции usort здесь: http://php.net/manual/en/function.usort.php

Насчет оператора сравнения:

return ($a['Symbol'] < $b['Symbol']) ? -1 : 1;
// Равносильно:
if ($a['Symbol'] < $b['Symbol']) return -1;
else return 1;


Правка: вернее сказать, что от ф-ции cmp требуется не именно +1 или -1, достаточно положительного или отрицательно значения. Т.е в вашем случае ф-ция cmp будет выглядеть очень просто:

fucntion cmp($a, $b){
return $a['createdon'] - $b['createdon'];
}

Спустя 1 час, 55 минут, 20 секунд (28.07.2010 - 20:48) ManManovich написал(а):
Nord, БОЛЬШОЕ спасибо! Стало ясней, но пока не до конца. Буду пользоваться и учиться. Только код должен быть:


fucntion cmp($a, $b){
return $b[createdon] - $a[createdon];
}


С кавычками не запустился.

Спустя 3 часа, 3 минуты, 37 секунд (28.07.2010 - 23:52) SlavaFr написал(а):
Цитата (ManManovich @ 28.07.2010 - 17:48)
С кавычками не запустился.

А вот это я не понял.

что касается функций которые callback функции используют и в чем их смысл то тут нужно посмотреть глазами программиста.
Представь себе, что ты знаеш как сортировать масив и тебе нужно в принципе знать какой элемент при сравнение между двумя элиментами является большим, чтоб посадить его на определенную позицию. для этого я прошу тебя зделать функцию с двумя параметрами в которой ты описываеш что ты из двух параметров щитаеш большим и именно эту твою функцию использую для сортировки.

Другими словами зделаем для начала сами функцию сортировки.
возмем для этого примитивный бублесорт алгоритм

/**
* функция по сортировке масива
*
*
@param array : масив который сортируем
*
@return array : отсортированный масив
*/

function bubbleSort($array ){
$n= count($array);
do{
$newn = 0;
for ($i=0 ;$i<= $n-2;$i++) {
if ($array[$i] > $array[ $i + 1 ]){//смотрем внимательно здесь
$t= $array[$i];
$array[$i]= $array[ $i + 1 ];
$array[$i + 1 ]=$t;
$newn = $i + 1;
}
}

$n = $newn;
}while ($n > 1);
return $array;
}


пока мы работаем с числами все работает превосходно

$a=array(55,34,78,12,2);
echo print_r( bubbleSort($a),true);

но когда мы хотим отсортировать такой масив как у тебя или чтото подобное, то возникает проблема в этом участке : if ($array[$i] > $array[ $i + 1 ]){
мы не можем сравнить твой масив в $array[$i] с масивом в $array[ $i + 1 ] посредством оператора ">".
что делать?
мы решаем дело просто. мы пердеаем эти два значения в функцию которую ты сам написал и если она выдает число больше нуля, то делаем заменну елементов в масиве.
переделываем нашу функцию так, чтоб ты сам мог дефинировать функцию сравнения двух переменных.

/**
* функция по сортировке масива
*
*
@param array : масив который сортируем
*
@param string : название функции сравнения двух елементов
*
@return array : отсортированный масив
*/

function bubbleSortCallback($array,$comparefunc){
$n= count($array);
do{
$newn = 0;
for ($i=0 ;$i<= $n-2;$i++) {
if ($comparefunc($array[$i] , $array[ $i + 1 ])>0){//применяем функцию сравнения
$t= $array[$i];
$array[$i]= $array[ $i + 1 ];
$array[$i + 1 ]=$t;
$newn = $i + 1;
}
}

$n = $newn;
}while ($n > 1);
return $array;
}


Теперь попробуем отсортировать этот масив:

$fruechte[0]["frucht"] = "Zitronen";
$fruechte[1]["frucht"] = "Aepfel";
$fruechte[2]["frucht"] = "Orangen";


Пишим нашу функцию сравнения двух элементов масива $fruechte

/**
* comaparator
*
*
@param array $a
*
@param array $b
*
@return int
*/

function sravnenie($a, $b)
{
return strcmp($a["frucht"], $b["frucht"]);
}

и применяем ее к нашему масиву

echo print_r( bubbleSortCallback($fruechte,'sravnenie'),true);


недеюсь теперь принцип происхождения и применения callback функций стал понятнее.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.