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

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

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 часов, чтобы заставить их принять эти таблетки.

0

Решение

Несколько идей для вашего вопроса:
использование 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

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector