Имя пользователя:
Пароль:
 

Название темы: Делимся опытом
Показать сообщение отдельно

Аватара для Prisoner

Engrossed by the Void


Сообщения: 2229
Благодарности: 60

Профиль | Отправить PM | Цитировать


Фенька №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 номер поля.

-------
Не могу дать более дельный совет - не хватает системных ресурсов...


Отправлено: 19:08, 30-07-2005 | #22

Название темы: Делимся опытом