Я работаю с многомерными массивами и пытаюсь создать динамическую диаграмму совместимости.
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 часов, чтобы заставить их принять эти таблетки.
Несколько идей для вашего вопроса:
использование 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
Других решений пока нет …