如何合并两个数组(带子数组),然后对结果数组进行排序和限制(按此顺序)


How to merge two arrays (with subarrays), then sort and limit (in this order) the resultant array?

我合并了两个数组(每个数组有1000个子数组)。然后我必须对新合并的数组进行排序,并再次将其限制为1000行。

查看代码:

$table1 = array(
    [0] => ('0' => 'A', '1' => 200),
    [1] => ('0' => 'B', '1' => 145),
    [2] => ('0' => 'C', '1' => 160),
    [3] => ('0' => 'D', '1' => 120),
    ...
    [999] => ('0' => 'Z', '1' => 135),
);
$table2 = array(
    [0] => ('0' => 'a', '1' => 20),
    [1] => ('0' => 'b', '1' => 145),
    [2] => ('0' => 'c', '1' => 500),
    [3] => ('0' => 'd', '1' => 600),
    ...
    [999] => ('0' => 'z', '1' => 135),
);
    // Merge arrays.
    $mergedTable = array_merge($table1,$table2);

,结果是:

$margedTable = array(
    [0] => ('0' => 'A', '1' => 200),
    [1] => ('0' => 'B', '1' => 145),
    [2] => ('0' => 'C', '1' => 160),
    [3] => ('0' => 'D', '1' => 120),
    ...
    [999] => ('0' => 'Z', '1' => 135),
    [1000] => ('0' => 'a', '1' => 20),
    [1001] => ('0' => 'b', '1' => 145),
    [1002] => ('0' => 'c', '1' => 500),
    [1003] => ('0' => 'd', '1' => 600),
    ...
    [1999] => ('0' => 'z', '1' => 135),
);

我现在有一个2000子数组/行数组。我可以分别对其进行排序或限制,但不能同时进行这两项操作。

为了限制它,我可以使用array_slice,但这样我将只有前1000行,这正是第一个数组= $table1。

$limitedTable = array_slice($mergedTable, 0, 999);

以避免我必须首先对合并的数组进行排序。我可以用下面的函数和排序来完成:

function sortByOne($a, $b) {
    $a = $a['1'];
    $b = $b['1'];
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}
usort($mergedTable, 'sortByOne');

,我有以下结果:

$margedTable = array(
    [1003] => ('0' => 'd', '1' => 600),
    [1002] => ('0' => 'c', '1' => 500),
    [0] => ('0' => 'A', '1' => 200),
    [2] => ('0' => 'C', '1' => 160),
    [1] => ('0' => 'B', '1' => 145),
    [1001] => ('0' => 'b', '1' => 145),
    [999] => ('0' => 'Z', '1' => 135),
    [1999] => ('0' => 'z', '1' => 135),
    [3] => ('0' => 'D', '1' => 120),
    ...
    [1000] => ('0' => 'a', '1' => 20),
);

在现实中,键不保持不变,所以我们有以下结果(但没关系):

$margedTable = array(
    [0] => ('0' => 'd', '1' => 600),
    [1] => ('0' => 'c', '1' => 500),
    [2] => ('0' => 'A', '1' => 200),
    [3] => ('0' => 'C', '1' => 160),
    [4] => ('0' => 'B', '1' => 145),
    [5] => ('0' => 'b', '1' => 145),
    [6] => ('0' => 'Z', '1' => 135),
    [7] => ('0' => 'z', '1' => 135),
    [8] => ('0' => 'D', '1' => 120),
    ...
    [1999] => ('0' => 'a', '1' => 20),
);

现在的问题是我不能限制这个。我试过了,就像那样,但后来我收到一个布尔值(?)= 1

 $limitedTable = usort($mergedTable, 'sortByOne');
 print_r($limitedTable);

和结果= 1

数组通过引用传递给排序函数。这意味着传递的数组将被修改,而不是作为函数结果返回。

参见通过引用传递和ussort()获得更详细的解释。

要限制你的排序数组,你只需要:

usort($mergedTable, 'sortByOne');
$limitedTable = array_slice($mergedTable, 0, 999);

为什么要将$limitedTable赋值给ussort的结果?如果排序成功,Usort将返回true,如果排序不成功则返回false,它不返回数组,第一个参数是通过引用传递的数组。如果我正确地遵循了这一点,您不需要做以下事情吗?

usort($mergedTable, 'sortByOne'); //sort the $mergedTable array
$limitedTable = array_slice($mergedTable, 0, 999); //return array of first 1000 elements 
print_r($limitedTable);