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

时间:2014-08-07 01:14:24

标签: php arrays sorting merge limit

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

我将不胜感激。

2 个答案:

答案 0 :(得分:1)

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

有关详细说明,请参阅Passing by Referenceusort()

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

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);