Как мне разложить массив с возможными пустыми слотами?

Я работаю с многомерными массивами и пытаюсь создать динамическую диаграмму совместимости.

Given Data : 
4 instances of Value 1
7 instances of Value 2

Примеры идеального конечного результата

Если есть 4 значения 1 и 7 значения 2

[0] Value 2
[1] Value 1
[2] Value 2
[3] 
[4] Value 2
[5] Value 1
[6] Value 2
[7] 
[8] Value 2
[9] Value 1
[10] Value 2
[11] Value 1
[12] Value 2

Если есть 4 значения 1 и 4 значения 2 (попробуйте равномерно распределить их, не перекрывая друг друга)

[0] Value 1
[1] Value 2
[2]
[3] Value 1
[4] Value 2
[5]
[6] 
[7] Value 1
[8] Value 2
[9] 
[10] 
[11] Value 1
[12] Value 2

Если есть 2 экземпляра 1 и три из 2.

[0] Value 1
[1] Value 2
[2]
[3] 
[4] 
[5]
[6] Value 2
[7] 
[8] 
[9] 
[10] 
[11] Value 1
[12] Value 2

У меня есть размеры ведра 12-24 для массива. В примере я использую 12. Если число экземпляров не помещается в 12 сегментов, может переместиться вверх до 24. Если оно не помещается в 24, выдайте ошибку.

Любой цикл, который я пытался сделать, используя array_pop и реверсивные массивы, создает пустые дыры в середине массива или не распределяет экземпляры равномерно.


Изменить: вот что я пытался.

$table_array = range(0,12);
// Method 1 

for ($i = 0; sizeof($table_array); $i++)
{
    $ready_array[] = ($i % 2) ? array_pop($table_array) : array_shift($table_array);
}


// Method 2

for ($i = 0; $i < sizeof($table_array); $i++)
{
    $index = ($i % 2) ? sizeof($table_array) - ceil($i / 2) : ceil($i / 2);
    $ready_array[$index] = $table_array[$i];
}
ksort($ready_array);

Детали проекта и цель

У меня есть список совместимых и несовместимых таблеток.

Я позволяю пользователям выбирать, какие таблетки и сколько они принимают.

Исходя из этого, я ищу в базе данных и подбираю таблетки на основе совместимости, создавая списки, известные как Значение 1 и Значение 2.

У меня есть минимум 12 часов для приема таблеток.

Я должен распределить, скажем, 4 из кальция и 3 из железа равномерно в течение 12 часов с интервалом в 1 час и не допускать их перекрытия. Если они выберут 12 таблеток кальция и 12 таблеток железа, я могу подождать до 24 часов, чтобы заставить их принять эти таблетки.

1 ответ

Некоторые идеи для вашего вопроса: Используйте array_chunk() а также array_count_values()

<?php 

$myarray = array(2,1,2,'',2,1,2,'',2,1,2,1,1,2,1,2,'',2,1,2,'',2,1,2,1,2);
$tests = array_chunk($myarray, 13);
//print_r($tests);

function mytest($tests)
{
    foreach($tests as $test) 
    {
        // play your test !
        print_r(array_count_values($test));
    }    
}
// add your argument for your test
echo mytest($tests);
?>

выход:

Array
(
    [2] => 6
    [1] => 5
    [] => 2
)
Array
(
    [2] => 7
    [1] => 4
    [] => 2
)

Смотрите для теста: http://codepad.org/M9u5G0je

Другие вопросы по тегам