PHP使用不同的属性来收集集合

时间:2017-01-26 10:39:23

标签: php arrays sorting

我有两个相同的数组:

$array1 = array(
    array(
        'start' => 1,
        'value' => 10
    ),
    array(
        'start' => 8,
        'value' => 4
    ),
    array(
        'start' => 4,
        'value' => 8
    ),
    array(
        'value' => 5,
    )
);

$array2 = array(
    array(
        'start' => 1,
        'value' => 10
    ),
    array(
        'start' => 8,
        'value' => 4
    ),
    array(
        'start' => 4,
        'value' => 8
    ),
    array(
        'value' => 5,
    )
);

我需要按升序合并和排序:

$array1 = array_merge($array1, $array2);

usort($array1, function($value1, $value2) {
    if (!array_key_exists('start', $value1) || !array_key_exists('start', $value2)) {
        return 0;
    }

    return $value1['start'] - $value2['start'];
});

但是,这不起作用,并且排序不正确:

Array
(
    [0] => Array
        (
            [start] => 4
            [start] => 8
        )

    [1] => Array
        (
            [start] => 8
            [value] => 4
        )

    [2] => Array
        (
            [amount] => 5
        )

    [3] => Array
        (
            [start] => 1
            [value] => 10
        )

    [4] => Array
        (
            [value] => 5
        )

    [5] => Array
        (
            [start] => 1
            [value] => 10
        )

    [6] => Array
        (
            [start] => 4
            [value] => 8
        )

    [7] => Array
        (
            [start] => 8
            [value] => 4
        )

)

理想情况下,应该将没有start属性的所有项目放在数组的开头,并且所有具有start属性的项目都按升序排列。

如果我删除不包含start属性的数组,它似乎完美无缺。但我需要保留那些没有start属性的项目。有没有什么我可以解决这个问题而不经过合并数组,删除没有start的那些并在排序后替换它们?理想情况下,我很想了解这里发生的事情,以使其失败。

1 个答案:

答案 0 :(得分:4)

要在前面放置没有开始键的元素,你必须在比较函数中不同地处理它们。

你可以试试这样的事情

usort($array1, function($value1, $value2) {
    if (!isset($value1['start']) && !isset($value2['start'])) {
        return 0;
    } else if (!isset($value1['start'])) {
        return -1;
    } else if (!isset($value2['start'])) {
        return 1;
    }

    return $value1['start'] - $value2['start'];
});