我合并了两个数组(每个数组有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);