PHP递归函数显示数组值的有效组合

时间:2009-12-19 10:22:58

标签: php arrays recursion

我有一个如下所示的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数组,当用户选择值时,我将使用它来更新页面上的选项。例如,当他们选择黑色时,我需要更新页面上的尺寸和长度,以仅反映黑色的尺寸和长度。我可以手动创建数组,但这不是一个好的解决方案。

3 个答案:

答案 0 :(得分:1)

好的,如果我现在就知道了,那么你的产品有四个属性:id,颜色,大小和长度,你表示为

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

就个人而言,我发现这种结构有点笨拙。产品ID应该在数组内部,因为它是产品的属性。此外,使用索引号而不是属性名称会使您的产品难以理解。

现在,您要做的是,查找其中一个属性的所有可能组合,例如当用户选择color_id时,例如size_id和length_id黑色。

你可以用finder方法做到这一点:

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;
}

现在,当你需要找到黑色和黑色的所有组合时,color_id为0,你会做findCombinationsByColorId(0, $productArray)并返回一个数组,其中包含此颜色的所有可能尺寸,长度和产品ID。 / p>

您可以编写其他功能,以便通过其他属性获取组合。你可以让finder方法通用,但我把它留给你来弄清楚如何。

我没有得到的是为什么你要在阵列级别对它进行排序。我假设你从某个地方获得了可能的产品,例如一个数据库。那么为什么不从那里得到组合。这可能就像SELECT size_id, length_id, product_id from products where color_id = 0一样简单。

答案 1 :(得分: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);
}

答案 2 :(得分:0)

Gordon提供的答案与我正在寻找的最接近,但考虑到我的初始数组的格式化方式,效率不高。虽然我不记得为什么现在,我使用数组的最初目的是避免每次有人选择一个选项时都要创建一个新的查询。简单的解决方案就是继续进行查询,这就是我要做的事情。