我有4个数组,并使用array_multissort对它们同时进行排序。问题是,在第一个数组中,可能有空值,我想把它们放在末尾,而不是开头。
示例:http://codepad.org/V6TjCsS5
有没有办法:
- 将自定义函数传递给array_multisort或
- 使用自定义函数对第一个数组进行排序,然后使用结果顺序对其他数组进行排序或
- 使用array_multissort的某个参数来实现我想要的
非常感谢
不幸的是,您提出的任何方法都不可能实现,这意味着您必须再退一步,寻找替代方案。我假设你想要一个正常的升序,除了空元素(你是"最小的")需要被认为是"最大的"这一明确的例外。
选项1:排序后手动重新排列元素
像往常一样进行array_multisort
,然后进行所需的修改:
// $arr1, $arr2 etc have been sorted with array_multisort
while(reset($arr1) == '') {
$k = key($arr1);
unset($arr1[$k]); // remove empty element from beginning of array
$arr1[$k] = ''; // add it to end of array
// and now do the same for $arr2
$v = reset($arr2);
$k = key($arr2);
unset($arr2[$k]);
$arr2[$k] = $v;
// the same for $arr3, etc
}
你可以在一个函数中提取部分代码,使其更漂亮:
function shift_and_push(&$arr) {
$v = reset($arr);
$k = key($arr);
unset($arr[$k]);
$arr[$k] = $v;
}
选项2:将所有内容浓缩在一个数组中,以便使用usort
这里的想法是将所有数组合并为一个数组,这样您就可以使用usort
:指定比较函数
$allArrays = array_map(function() { return func_get_args(); },
$array1, $array2 /* , as many arrays as you want */);
您现在可以排序:
// writing this as a free function so that it looks presentable
function cmp($row1, $row2) {
// $row1[0] is the item in your first array, etc
if($row1[0] == $row2[0]) {
return 0;
}
else if($row1[0] == '') {
return 1;
}
else if($row2[0] == '') {
return -1;
}
return $row1[0] < $row2[0] ? -1 : 1;
}
usort($allArrays, "cmp");
此时,您只剩下一个数组,其中的每个元素(行)都是一个数组。每个数组的第一个元素是最初在$array1
中的元素,第二个元素是$array2
中的元素等等。通过将这些元素放在"行"中,我们成功地保持了所有原始数组之间的排序顺序同步。
array_multsort的第二个参数可以是排序的选项。因此,如果SORT_ASC
的操作与您想要的相反,则可以传递SORT_DESC
。
array_multisort($arr, SORT_DESC);
为了完整起见,以下是其他选项SORT_ASC, SORT_DESC, SORT_REGULAR, SORT_NUMERIC, SORT_STRING
。CCD_ 9可能会有所帮助。
您真的想要空元素吗?只需在排序前删除它们:
foreach($array1 as &$v) {
if($v==='')
{
unset($v);
}
}