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


How to create an array ordered by an alternated priority?

我得到了一个包含近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_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('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'

有人知道怎么做吗?

您可以尝试:

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

参见Live Demo