ordenar array multidimensional
Alguém sabe dizer porque essa função não funciona no PHP 5.3?
Nas versões anteriores funciona sem problemas.
Foi retirada de http://br2.php.net/manual/pt_BR/function.array-multisort.php
<?php
/**
* Sort DB result
*
* @param array $data Result of sql query as associative array
*
* Rest of parameters are optional
* [, string $name [, mixed $name or $order [, mixed $name or $mode]]]
* $name string - column name i database table
* $order integer - sorting direction ascending (SORT_ASC) or descending (SORT_DESC)
* $mode integer - sorting mode (SORT_REGULAR, SORT_STRING, SORT_NUMERIC)
*
* <code>
* <?php
* // You can sort data by several columns e.g.
* $data = array();
* for ($i = 1; $i <= 10; $i++) {
* $data[] = array( 'id' => $i,
* 'first_name' => sprintf('first_name_%s', rand(1, 9)),
* 'last_name' => sprintf('last_name_%s', rand(1, 9)),
* 'date' => date('Y-m-d', rand(0, time()))
* );
* }
* $data = sortDbResult($data, 'date', SORT_DESC, SORT_NUMERIC, 'id');
* printf('<pre>%s</pre>', print_r($data, true));
* $data = sortDbResult($data, 'last_name', SORT_ASC, SORT_STRING, 'first_name', SORT_ASC, SORT_STRING);
* printf('<pre>%s</pre>', print_r($data, true));
* ?>
* </code>
*
* @return array $data - Sorted data
*/
function sortDbResult($data /*$name, $order, $mode*/) {
$_argList = func_get_args();
$_data = array_shift($_argList);
if (empty($_data)) {
return $_data;
}
$_max = count($_argList);
$_params = array();
$_cols = array();
$_rules = array();
for ($_i = 0; $_i < $_max; $_i += 3)
{
$_name = (string) $_argList[$_i];
if (!in_array($_name, array_keys(current($_data)))) {
continue;
}
if (!isset($_argList[($_i + 1)]) || is_string($_argList[($_i + 1)])) {
$_order = SORT_ASC;
$_mode = SORT_REGULAR;
$_i -= 2;
} else if (3 > $_argList[($_i + 1)]) {
$_order = SORT_ASC;
$_mode = $_argList[($_i + 1)];
$_i--;
} else {
$_order = $_argList[($_i + 1)] == SORT_ASC ? SORT_ASC : SORT_DESC;
if (!isset($_argList[($_i + 2)]) || is_string($_argList[($_i + 2)])) {
$_mode = SORT_REGULAR;
$_i--;
} else {
$_mode = $_argList[($_i + 2)];
}
}
$_mode = $_mode != SORT_NUMERIC
? $_argList[($_i + 2)] != SORT_STRING ? SORT_REGULAR : SORT_STRING
: SORT_NUMERIC;
$_rules[] = array('name' => $_name, 'order' => $_order, 'mode' => $_mode);
}
foreach ($_data as $_k => $_row) {
foreach ($_rules as $_rule) {
if (!isset($_cols[$_rule['name']])) {
$_cols[$_rule['name']] = array();
$_params[] = &$_cols[$_rule['name']];
$_params[] = $_rule['order'];
$_params[] = $_rule['mode'];
}
$_cols[$_rule['name']][$_k] = $_row[$_rule['name']];
}
}
$_params[] = &$_data;
call_user_func_array('array_multisort', $_params);
return $_data;
}
?>Discussão (4)
Carregando comentários...