我合并了两个数组(每个数组有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);
为了避免我首先对合并的数组进行排序。我可以使用以下函数和usort执行此操作:
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
我将不胜感激。
答案 0 :(得分:1)
通过引用排序函数传递数组。这意味着将传递数组,而不是作为函数结果返回。
有关详细说明,请参阅Passing by Reference和usort()。
要限制已排序的数组,只需:
usort($mergedTable, 'sortByOne');
$limitedTable = array_slice($mergedTable, 0, 999);
答案 1 :(得分:1)
为什么要将$ limitedTable分配给usort的结果? 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);