Сортировка массива по полю или uasort на стероидах
Если часто надо сортировать массив по разным полям, то вручную лень писать callback-функции. А иногда надо сортировать ещё по нескольким полям. Тогда можно запутаться и наделать ошибок.
Кстати, если кто-то не понял, что я такое написал, идите на php.net/uasort и читайте как PHP способствует деградации программистов, потому что теперь почти никто не напишет сам 5 разных способов сортировки массива. В комментариях к документации я нашёл интересную функцию, которую немного доработал.
Теперь для того чтобы отсортировать массив по полю "name" можно писать
-
masort($yourArray, 'name');
Чтобы отсортировать массив по полю "surname", а те у кого одинаковый "surname", по полю "name"
-
masort($yourArray, 'surname, name');
И даже можно так
-
masort($yourArray, 'priority DESC, surname, name');
DESC обязательно писать заглавными. ASC не работает - это вам не SQL.
Пробелы после запятых можно ставить, а можно и не ставить - они trimаются.
А вот и сама функция
-
function masort(&$data, $sortby) {
-
-
$code = "\$c=0;";
-
$asc = false;
-
} else {
-
$asc = true;
-
}
-
-
-
if ($asc) {
-
$code .= "if ( \$c = ((\$a['$key'] == \$b['$key']) ? 0:((\$a['$key'] " . (($asc)?'<':'>') . " \$b['$key']) ? -1 : 1 )) ) return \$c;";
-
} else {
-
$code .= "if ( (\$c = strcasecmp(\$a['$key'],\$b['$key'])) != 0 ) return " . (($asc)?'':'-') . "\$c;\n";
-
}
-
}
-
}
-
$code .= 'return $c;';
-
} else {
-
$func = $funcs[$sortby];
-
}
-
$func = $funcs[$sortby];
-
-
}
Спасибо за статью. Иногда требуется сделать что-то подобное, обычно обходился по деревенски: foreach и запись в новый массив. Теперь буду использовать эту функцию
А я эту функцию не понял, честно говоря. Вот если бы кто-то обьяснил что тут к чему.
Эх... Таки деградирует молодое поколение
Надо либо учить матчасть, либо не париться и просто копипастить
Что такое DESC ?
Сортировка не А-Я, а Я-А
В коде функции ошибочка:
if ($asc) {
if(is_numeric($array[$key])) {
$code .= "if ( \$c = ((\$a['$key'] == \$b['$key']) ? 0:((\$a['$key'] " . (($asc)?'') . " \$b['$key']) ? -1 : 1 )) ) return \$c;";
} else {
$code .= "if ( (\$c = strcasecmp(\$a['$key'],\$b['$key'])) != 0 ) return " . (($asc)?'':'-') . "\$c;\n";
}
}
здесь лишний if ($asc) {...} надо так:
if(is_numeric($array[$key])) {
$code .= "if ( \$c = ((\$a['$key'] == \$b['$key']) ? 0:((\$a['$key'] " . (($asc)?'') . " \$b['$key']) ? -1 : 1 )) ) return \$c;";
} else {
$code .= "if ( (\$c = strcasecmp(\$a['$key'],\$b['$key'])) != 0 ) return " . (($asc)?'':'-') . "\$c;\n";
}
заметил когда передавал DESC. У себя исправил и использую.
Спасибо за функцию!
В коде функции ошибочка:
if ($asc) {
if(is_numeric($array[$key])) {
$code .= "if ( \$c = ((\$a['$key'] == \$b['$key']) ? 0:((\$a['$key'] " . (($asc)?'') . " \$b['$key']) ? -1 : 1 )) ) return \$c;";
} else {
$code .= "if ( (\$c = strcasecmp(\$a['$key'],\$b['$key'])) != 0 ) return " . (($asc)?'':'-') . "\$c;\n";
}
}
здесь лишний if ($asc) {...} надо так:
if(is_numeric($array[$key])) {
$code .= "if ( \$c = ((\$a['$key'] == \$b['$key']) ? 0:((\$a['$key'] " . (($asc)?'') . " \$b['$key']) ? -1 : 1 )) ) return \$c;";
} else {
$code .= "if ( (\$c = strcasecmp(\$a['$key'],\$b['$key'])) != 0 ) return " . (($asc)?'':'-') . "\$c;\n";
}
заметил когда передавал DESC. У себя исправил и использую.
Спасибо за функцию!
В функции было две баги (портятся ключи, не правильно обрабатывает DESC).
Вот исправленный вариант:
function masort(&$data, $sortby) {
static $funcs = array();
if (empty($funcs[$sortby])) {
$code = "\$c=0;";
foreach ($data as &$array) { break; }
foreach (split(',', $sortby) as $key) {
$key = trim($key);
if (strlen($key)>5 && substr($key, -5)==' DESC') {
$asc = false;
$key = substr($key, 0, strlen($key)-5);
} else {
$asc = true;
}
if(is_numeric($array[$key])) {
$code .= "if ( \$c = ((\$a['$key'] == \$b['$key']) ? 0:((\$a['$key'] " . (($asc)?'') . " \$b['$key']) ? -1 : 1 )) ) return \$c;";
} else {
$code .= "if ( (\$c = strcasecmp(\$a['$key'],\$b['$key'])) != 0 ) return " . (($asc)?'':'-') . "\$c;\n";
}
}
$code .= 'return $c;';
$func = $funcs[$sortby] = create_function('$a, $b', $code);
} else {
$func = $funcs[$sortby];
}
return uasort($data, $func);
}