【问题标题】:PHP recursion function to show valid combinations of array valuesPHP递归函数显示数组值的有效组合
【发布时间】:2010-12-28 07:13:38
【问题描述】:

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

【问题讨论】:

  • 什么构成有效值
  • 我编辑了我的问题以澄清什么是有效值。
  • productID 应该在输出数组中吗?而不是属性值
  • 虽然以下解决方案之一可能有效,但我建议您创建一些类来更好地组织它...

标签: php arrays recursion


【解决方案1】:

假设输出实际上应该是:

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】:

    好的,如果我现在明白了,您的产品有四个属性: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 的数组。

    您需要编写额外的函数来获取其他属性的组合。您可以将 finder 方法设为通用,但我让您自己弄清楚如何做。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2019-02-20
        • 1970-01-01
        • 2017-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多