2014-12-29 47 views
0

我正在處理多維數組,並難以嘗試創建動態兼容性圖表。如何分配可能的空插槽陣列?

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的(儘量均勻空間他們out不重疊)

[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個實例s的1和3 2. 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和reverseing數組創建的任何循環都會在數組中間創建空洞,或者它不會均勻分散實例。


編輯: 這是我試過的。

$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小時的時間幀,以採取藥片藥片。

我應該在太空中用1小時的間隔在12小時內平均分配鈣和3的鐵,並且不要讓它們重疊。如果他們選擇12片鈣片和12片鐵片,我可以長達24小時讓他們服用這些藥片。

+0

檢查的if語句裝載值時。 –

+1

爲了清楚起見,優先級是:'a','ab','aba','ababa'等(如果a是「值1」或「值2」則無關緊要)?我的意思是:如果可能,留下所有值之間的空格('a');如果沒有,請添加儘可能少的'ab'(即由空格包圍的兩個不同的值),等等? –

+1

如上所述,請澄清您的算法的標準,並且還請顯示您的(失敗)嘗試示例 – Steve

回答

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