2012-06-05 44 views
0

我有一個數組:PHP - 取決於值結構多維數組

$initialarray = array(
    0 = array(
    'unit' => 1, 
    'class' => 1, 
    'value' => 'string1' 
), 
    1 = array(
    'unit' => 1, 
    'class' => 2, 
    'value' => 'string2' 
), 
    2 = array(
    'unit' => 1, 
    'class' => 2, 
    'value' => 'string3' 
), 
    3 = array(
    'unit' => 2, 
    'class' => 1, 
    'value' => 'string4' 
) 
    4 = array(
    'unit' => 2, 
    'class' => 2, 
    'value' => 'string5' 
) 
); 

什麼會是根據第一對「單元」字段的值來構造它(以組所得到的子陣列)的最佳方式,然後根據不同的「類」字段的值,就像這樣:

$resultarray = array(
    // array of all the sub-arrays of 'unit' = 1 
    $unit[1] = array(
    // array of all the sub-arrays of 'unit' = 1 and 'class' = 1 
    $class[1] = array(
     0 = array(
     'unit' => 1, 
     'class' => 1, 
     'value' => 'string1' 
    ) 
    ) 
    // array of all the sub-arrays of 'unit' = 1 and 'class' = 2 
    $class[2] = array(
     0 = array(
     'unit' => 1, 
     'class' => 2, 
     'value' => 'string2' 
    ), 
     1 = array(
     'unit' => 1, 
     'class' => 2, 
     'value' => 'string3' 
    ) 
    ) 
) 
    // array of all the sub-arrays of 'unit' = 2 
    $unit[2] = array(
    // array of all the sub-arrays of 'unit' = 2 and 'class' = 1 
    $class[1] = array(
     0 = array(
     'unit' => 2, 
     'class' => 1, 
     'value' => 'string4' 
    ) 
    ) 
    // array of all the sub-arrays of 'unit' = 2 and 'class' = 2 
    $class[2] = array(
     0 = array(
     'unit' => 2, 
     'class' => 2, 
     'value' => 'string5' 
    ) 
    ) 
) 
) 

我曾問過類似的問題here並得到了只有一個迭代工作的答案,即只通過其中的一個字段構建陣列。但是我無法讓多個迭代的同一個解決方案工作,即不止一個字段。

另外,是否有一個解決方案來構建一個多維數組取決於兩個以上的領域?

+1

難道你不能使用(關係)數據庫嗎? – Havelock

+1

@Havelock你能更具體嗎? –

回答

1

我認爲這不是一個問問題的方式。這很簡單,你可以通過玩數組,鍵等來做到這一點......所以首先你應該努力解決這個問題。之後如果你在嘗試中途遇到任何問題,那麼你可以在這裏問問。我已經在這裏解決了你的問題是完整的代碼,但下次請做一些工作,然後只發布問題。從不要求代碼。

foreach ($initialarray as $key1=>$val1) 
{ 
    foreach ($val1 as $key2=>$val2) 
    {    

     if($key2=='unit') 
     { 
      $num=$val2; 
      if($val2!=$num) 
      $testarr['unit'.$val2]=array(); 
     } 
     if($key2=='class') 
     { 
      $testarr['unit'.$num]['class'.$val2][]=$val1; 
     } 

    } 
} 

print_r($testarr); 
+0

非常感謝你,這工作。也許我現在不是提問簡單的地方,我將來會更謹慎。我是一個PHP初學者。但是我花了3天的時間試圖解決這個問題,只有在失敗後才決定在StackOverflow上提出問題。我還在互聯網上搜索了很多答案,但無法找到與您的解決方案相近的東西。 –

0

如果我可以用以下方式表達我自己:我只看到問題的前端,對後端一無所知,例如, 「數據從哪裏來?」,「如何收集和存儲」等,所以我的回答可能不是真正的幫助,但我仍然會給我「調皮」。
如果您可以將所有數據存儲在關係數據庫中(以表格的形式),那麼從數據庫中選擇所需數據而不是重新排列數組會更容易和更快(!),這將需要一些比較多的時間。
就像一個例子,您可以選擇(並將其存儲到數組中)所有具有unit = '1'的項目和/或具有class = '2'的所有項目。這會讓生活更容易IMHO,比將所有數據放在多維數組中,然後嘗試對它進行排序/重新排列它。特別是如果你這樣做的基礎上不止一個財產。

+0

非常感謝您的建議。我自己一直在想這個問題。我正在嘗試使用Codeigniter構建自定義CMS。單元和類將被用戶插入到數據庫中。例如,一個單位可以是一篇博客文章或一個頁面,而一個班級是該單位的自定義分類標準 - 一個頁面標題,一個頁面文本,一個博客標題或一個博客特色圖片等等。問題出在那裏既不是有限數量的單位也不是類,所以這就是爲什麼我不能把每個單元或每個類放在一個單獨的表中。 –

+0

噢,那麼我會建議讓SQL完成所有這些工作 - 它更有效(在時間和資源上便宜)。爲了這個目的,我看到它,你需要一個用於分類的表,它有兩列(屬性)'unit'和'class'來表示單元和類之間的關係(因此*關係*數據庫),然後將表示在兩個單獨的表 – Havelock

+0

現在我明白你的意思了。我也在考慮這一點,但我只想看看這兩種解決方案中的哪一種會更好。我得到了我的問題的解決方案,但我會A/B測試'兩個數據庫結構,看看哪一個會變得更優雅。非常感謝您的建議。 –