Фенька №19
Порой необходимо сортировать многомерные массивы.
Код:

array(8) {
[0]=>
array(7) {
["UID"]=>
string(2) "92"
["owner"]=>
string(9) "Петров П."
["post"]=>
string(6) "Стажер"
}
[1]=>
array(7) {
["UID"]=>
string(2) "62"
["owner"]=>
string(9) "Иванов И."
["post"]=>
string(6) "Мастер"
}
[2]=>
array(7) {
["UID"]=>
string(2) "61"
["owner"]=>
string(10) "Сидоров С."
["post"]=>
string(6) "Стажер"
}
Причем по какому полю - не известно, в перспективе необходима возможность сортировки по всем полям. Тут поможет
create_function.
Цитата:
string create_function (string args, string code)
Создаёт анонимную функцию из передаваемых параметров и возвращает уникальное имя для неё. Обычно аргументы args будут передаваться в единой закавыченной строке, это же рекомендуется и для code. Смысл использования отдельных закавыченных строк в том, чтобы защитить имена переменных от разбора, иначе, если вы используете двойные кавычки, появится необходимость мнемонизировать имена переменных, например, \$avar.
Вы можете использовать эту функцию для (например) создания функции из информации, получаемой на этапе прогона:Пример 1. Создание анонимной функции с помощью create_function()
$newfunc = create_function('$a,$b','return "ln($a) + ln($b) = ".log($a * $b);');
echo "New anonymous function: $newfunc\n";
echo $newfunc(2,M_E)."\n";
// выводит:
// New anonymous function: lambda_1
// ln(2) + ln(2.718281828459) = 1.6931471805599
|
Пусть имеется список допустимых полей по которому мы должны обеспечить сортировку - как бы ограничитель полей по которым вообще можно сортировать (так или иначе он у нас будет, либо из головы, либо из БД (см.
fetch_fields)):
$arFields = array('field1', 'field2', 'field3');
тогда сортировка вышеприведенного массива выглядит примерно так:
Код:

if ($up === true)
usort($array, create_function('$a,$b','if ($a[\''.$arFields[$FID].'\'] == $b[\''.$arFields[$FID].'\']) return 0; else return ($a[\''.$arFields[$FID].'\'] < $b[\''.$arFields[$FID].'\']) ? -1 : 1;'));
else
usort($fResult, create_function('$a,$b','if ($a[\''.$arFields[$FID].'\'] == $b[\''.$arFields[$FID].'\']) return 0; else return ($a[\''.$arFields[$FID].'\'] > $b[\''.$arFields[$FID].'\']) ? -1 : 1;'));
Где $FID номер поля.