如何创建按交替优先级排序的数组?

时间:2013-04-29 17:32:02

标签: php arrays

我有一个几乎有50K + sub_arrays的数组。按优先顺序排列所有这些都不是问题所在,所以我设法让它看起来像这样:

$SendQueue = array(
    array('3', '+553400000001', 'My text messege here'),
    array('3', '+553400000002', 'My text messege here'),
    array('3', '+553400000003', 'My text messege here'),
    array('3', '+553400000004', 'My text messege here'),
    array('3', '+553400000005', 'My text messege here'),
    array('3', '+553400000006', 'My text messege here'),
    array('3', '+553400000007', 'My text messege here'),
    array('3', '+553400000008', 'My text messege here'),
    array('3', '+553400000009', 'My text messege here'),
    array('3', '+553400000010', 'My text messege here'),
    array('3', '+553400000011', 'My text messege here'),
    array('3', '+553400000012', 'My text messege here'),
    array('2', '+553400000013', 'My text messege here'),
    array('2', '+553400000014', 'My text messege here'),
    array('2', '+553400000015', 'My text messege here'),
    array('2', '+553400000016', 'My text messege here'),
    array('2', '+553400000017', 'My text messege here'),
    array('2', '+553400000018', 'My text messege here'),
    array('1', '+553400000019', 'My text messege here'),
    array('1', '+553400000020', 'My text messege here'),
);
//where '3', '2' and '1' are my priorities' types

我真正需要的是交替那些sub_array,所以它们看起来像这样:

$SendQueue = array(
    array('3', '+553400000001', 'My text messege here'),
    array('3', '+553400000002', 'My text messege here'),
    array('3', '+553400000003', 'My text messege here'),
    array('3', '+553400000004', 'My text messege here'),
    array('3', '+553400000005', 'My text messege here'),
    array('3', '+553400000006', 'My text messege here'),
    array('2', '+553400000013', 'My text messege here'),
    array('2', '+553400000014', 'My text messege here'),
    array('2', '+553400000015', 'My text messege here'),
    array('1', '+553400000019', 'My text messege here'),
    array('3', '+553400000007', 'My text messege here'),
    array('3', '+553400000008', 'My text messege here'),
    array('3', '+553400000009', 'My text messege here'),
    array('3', '+553400000010', 'My text messege here'),
    array('3', '+553400000011', 'My text messege here'),
    array('3', '+553400000012', 'My text messege here'),
    array('2', '+553400000016', 'My text messege here'),
    array('2', '+553400000017', 'My text messege here'),
    array('2', '+553400000018', 'My text messege here'),
    array('1', '+553400000020', 'My text messege here'),
);
//Each 10 sub_arrays, 6 of them are priority '3', 3 of them are priority '2' and 1 of them is priority '1'

有谁知道怎么做?

1 个答案:

答案 0 :(得分:2)

您可以尝试:

//Group the array
$group = array_reduce($SendQueue, function ($a, $b) {
    $a[$b[0]][] = $b;
    return $a;
});


$final = array();

while(count($final) < count($SendQueue)) {
    // 6 of them are priority '3'
    $final = array_merge($final, array_slice($group[3], 0, 6));
    // 3 of them are priority '2'
    $final = array_merge($final, array_slice($group[2], 0, 3));
    // 1 of them are priority '1'
    $final = array_merge($final, array_slice($group[1], 0, 1));
}

print_r($final);

See Live Demo