我有两个相同的数组:
$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
的那些并在排序后替换它们?理想情况下,我很想了解这里发生的事情,以使其失败。
答案 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'];
});