具有不同属性的PHP usort集合

具有不同属性的PHP usort集合,php,arrays,sorting,Php,Arrays,Sorting,我有两个相同的数组: $array1 = array( array( 'start' => 1, 'value' => 10 ), array( 'start' => 8, 'value' => 4 ), array( 'start' => 4, 'value' => 8 ), array( '

我有两个相同的数组:

$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
的数组并在排序后替换它们吗?理想情况下,我很想了解这里发生了什么导致它失败。

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

你可以试试这样的

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'];
});

要在前面放置没有开始键的元素,必须在比较函数中对其进行不同的处理

你可以试试这样的

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'];
});

你是说任何没有
start
条目的东西都等于一切。你是说任何没有
start
条目的东西都等于一切。