gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:53:43 26 4
gpt4 key购买 nike

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

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

有没有办法:

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

  • 非常感谢

    最佳答案

    不幸的是,您提出的所有方法都不可行,这意味着您必须退后一步并寻找替代方案。我假设你想要一个正常的升序排序,除了空元素(你是“最小”)需要被视为“最大”的明确异常(exception)。

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

    关于php - 使用 array_multisort() 并将空值放在最后,而不是第一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9767398/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com