使用array_multisort()并将空值放在最后,而不是第一个

时间:2012-03-19 09:06:12

标签: php sorting

我有4个数组并使用array_multisort将它们相对于彼此同时排序。 问题是,在第一个数组中,可能存在空值,我想把它们放在最后,而不是开头。

示例:http://codepad.org/V6TjCsS5

有办法:

  • 将自定义函数传递给array_multisort 或
  • 使用自定义函数对第一个数组进行排序,然后使用结果顺序对其他数组进行排序 或
  • 使用array_multisort的某个参数来实现我想要的内容

非常感谢

3 个答案:

答案 0 :(得分:3)

不幸的是,你提议的方法都不可能,这意味着你必须再退一步寻找替代方案。我假设你想要一个正常的升序排序,明确的例外是空元素(你是“最小的”)需要被认为是“最大的”。

选项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中的元素,等等。通过将这些元素放在“行”中,我们设法保持所有的排序顺序原始数组同步。

答案 1 :(得分:0)

array_multisort的第二个参数可以是排序的选项。因此,如果SORT_DESC与你想要的相反,你可以通过SORT_ASC

array_multisort($arr, SORT_DESC);

为了完整起见,以下是其他选项SORT_ASC, SORT_DESC, SORT_REGULAR, SORT_NUMERIC, SORT_STRINGSORT_STRING可能会有帮助。

答案 2 :(得分:0)

你真的想要空元素吗?只需在排序前删除它们:

foreach($array1 as &$v) {
    if($v==='')
    {
        unset($v);
    }
}