|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2006-11-10 09:36 UTC] ricardo dot matters at mindbench dot nl
Description:
------------
To sort an multidimensional array, I'm using a wrapper for array_multisort. Was working just fine, but as from 5.2, nothing is being sorted. Documentation lacks any information if array_multisort has been changed.
Reproduce code:
---------------
function multisort() {
$n = func_num_args();
$ar = func_get_arg($n-1);
if (!is_array($ar))
return false;
for ($i = 0; $i < $n-1; $i++) {
$col[$i] = func_get_arg($i);
}
foreach($ar as $key => $val) {
foreach($col as $kkey => $vval) {
if (is_string($vval)) {
${"subar$kkey"}[$key] = $val[$vval];
}
}
}
foreach($col as $key => $val) {
$arv[] = (is_string($val) ? ${"subar$key"} : $val);
}
$arv[] = $ar;
call_user_func_array("array_multisort", $arv);
return $ar;
}
$ar = array(
array('id' => 1, 'weight' => 78, 'ts' => 123456),
array('id' => 1, 'weight' => 78, 'ts' => 123457),
array('id' => 1, 'weight' => 98, 'ts' => 134526),
array('id' => 1, 'weight' => 10, 'ts' => 112456),
array('id' => 1, 'weight' => 56, 'ts' => 177776)
);
print_r(multisort('weight', SORT_DESC, SORT_NUMERIC, 'ts', SORT_DESC, SORT_NUMERIC, $ar));
Expected result:
----------------
Array
(
[0] => Array
(
[id] => 1
[weight] => 98
[ts] => 134526
)
[1] => Array
(
[id] => 1
[weight] => 78
[ts] => 123457
)
[2] => Array
(
[id] => 1
[weight] => 78
[ts] => 123456
)
[3] => Array
(
[id] => 1
[weight] => 56
[ts] => 177776
)
[4] => Array
(
[id] => 1
[weight] => 10
[ts] => 112456
)
)
Actual result:
--------------
Array
(
[0] => Array
(
[id] => 1
[weight] => 78
[ts] => 123456
)
[1] => Array
(
[id] => 1
[weight] => 78
[ts] => 123457
)
[2] => Array
(
[id] => 1
[weight] => 98
[ts] => 134526
)
[3] => Array
(
[id] => 1
[weight] => 10
[ts] => 112456
)
[4] => Array
(
[id] => 1
[weight] => 56
[ts] => 177776
)
)
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Tue Oct 28 16:00:01 2025 UTC |
OK, I distilled some of the code, and found another curious aspect. If I run the code directly, the result is as expected. But if I put the same code in a function, it does not. Seems like a reference problem. Working: $weights = array(78,78,98,10,56); $tss = array( 1,2,3,4,5); $ar = array( array('weight' => 78, 'ts' => 1), array('weight' => 78, 'ts' => 2), array('weight' => 98, 'ts' => 3), array('weight' => 10, 'ts' => 4), array('weight' => 56, 'ts' => 5) ); array_multisort($weights, SORT_DESC, SORT_NUMERIC, $tss, SORT_DESC, SORT_NUMERIC, $ar); print_r($ar); NOT working: function multisort() { $weights = array(78,78,98,10,56); $tss = array( 1,2,3,4,5); $ar = array( array('weight' => 78, 'ts' => 1), array('weight' => 78, 'ts' => 2), array('weight' => 98, 'ts' => 3), array('weight' => 10, 'ts' => 4), array('weight' => 56, 'ts' => 5) ); array_multisort($weights, SORT_DESC, SORT_NUMERIC, $tss, SORT_DESC, SORT_NUMERIC, $ar); return $ar; } multisort($ar); print_r($ar);