2009-12-19 78 views
0

我有一個PHP數組,看起來像這樣:PHP遞歸函數來顯示陣列的有效組合值

Array 
(
[340] => Array 
    (
     [1] => 1 
     [2] => 18 
     [3] => 23 
    ) 

[341] => Array 
    (
     [1] => 1 
     [2] => 17 
     [3] => 23 
    ) 

[342] => Array 
    (
     [1] => 1 
     [2] => 16 
     [3] => 23 
    ) 

[343] => Array 
) 

的數組實際上較長,包含了大約40元。將會有其他數組包含不同數量的子元素。陣列格式爲

productID => array (
    $attributeID => attributeValueID, 
    $attributeID => attributeValueID, 
    $attributeID => attributeValueID 
) 

我需要的是一個數組,顯示所有其他屬性的有效值。輸出數組力量看起來像

Array 
(
18 => array(
    1 => array(
     11, 12, 13, 14, 15 
    ) 
    2 => array(
     19, 20, 21, 22 
    ) 
) 
19 => array(
    1 => array(
     11, 13, 14, 15 
    ) 
    2 => array(
     21, 22 
    ) 
) 

這個數組的格式是

attributeValueID => array(
    attributeID => attributeValues, 
    attributeID => attributeValues 
) 

我一直在與一些遞歸函數的工作,但我只能夠得到每一個可能的列表所有價值之間的結合並非我所需要的。任何幫助將不勝感激。

澄清我的意思是「有效」的值:1,2和3值代表的是顏色,大小和長度。這裏的最終目標是創建一系列javascript數組,當用戶選擇值時,我將使用它來更新頁面上的選項。例如,當他們選擇顏色黑色時,我需要更新頁面上的尺寸和長度以僅反映黑色中可用的尺寸和長度。我可以手動創建數組,但這不是一個好的解決方案。

+1

什麼構成*有效值*? – Gordon

+0

我編輯了我的問題,以澄清什麼是有效值。 – Jereme

+0

應該productID在輸出數組中嗎?而不是attributeValues –

回答

0

假設輸出實際上應該是:

attributeValueID => array(
    attributeID => productID, 
    attributeID => productID 
) 

(?如果不做的屬性值來自哪裏)

就沒有必要

遞歸,只是東西沿着這些路線重新跳汰數組:

$products = array( 340 => array(
            1 => 1, 
            2 => 18, 
            3 => 23 
            ), 

         341 => array(
            1 => 1, 
            2 => 17, 
            3 => 23 
            ), 

         342 => array(
            1 => 1, 
            2 => 16, 
            3 => 23 
            ), 

         343 => array() 
        ); 
$output = array(); 

foreach($products as $product_id=>$attributes){ 
    $attribute_id; 
    foreach($attributes as $attribute_id=>$attribute_value){ 
     $output[$attribute_value][$attribute_id][] = $product_id; 
    } 

    // optionaly filter for dup product ids 
    //$output[$attribute_value][$attribute_id] = array_unique($output[$attribute_value][$attribute_id], SORT_NUMERIC); 
} 
1

好吧,如果我得到的,現在,你有四個屬性的產品:編號,顏色,大小和長度,你代表的

[product_id] => array (
    1 => [color_id], 
    2 => [size_id], 
    3 => [length_id] 
) 

就我個人而言,我覺得這種結構有點笨拙。產品ID應該位於數組內,因爲它是產品的屬性。此外,使用索引號而不是屬性名稱,會使您的產品難以理解。

現在,您要做的是找到其中一個屬性的所有可能組合,例如,所有size_id和length_id,當用戶選擇例如color_id時黑色。

你可以做到這一點與查找方法:

function findCombinationsByColorId($color_id, $products) 
{ 
    $combos = array($color_id => array(
     'sizes' => array(), 
     'lengths' => array(), 
     'products' => array() 
    )); 

    foreach($products as $productId => $product) 
    { 
     if($product[1] === $color_id) { 
      $combos['sizes'][] = $product[2]; 
      $combos['lengths'][] = $product[3]; 
      $combos['products'][] = $productId; 
     } 
    } 
    return $combos; 
} 

現在,當你需要找到黑色和黑色所有的組合爲0 COLOR_ID,你會做findCombinationsByColorId(0, $productArray),它會返回一個數組控股所有可能的尺寸,長度和這種顏色的產品ID。

你會寫另外的函數來獲取其他屬性的組合。你可以使查找器的方法是通用的,但我可以讓你知道如何。

我沒有得到的是爲什麼你在數組級別上排序。我假設你從某處獲得可能的產品,例如一個數據庫。那麼爲什麼不從那裏拿到組合。這可能會像SELECT size_id, length_id, product_id from products where color_id = 0一樣簡單。

0

Gordon提供的答案與我正在尋找的最接近,但由於我的初始數組被格式化,效率不是很高。雖然我現在還記不起爲什麼,但我最初使用數組的目的是爲了避免每次有人選擇一個選項時都不得不重新進行查詢。簡單的解決方案就是繼續進行查詢,這就是我要做的。