Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP递归函数,用于显示数组值的有效组合_Php_Arrays_Recursion - Fatal编程技术网

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

PHP递归函数,用于显示数组值的有效组合,php,arrays,recursion,Php,Arrays,Recursion,我有一个PHP数组,如下所示: Array ( [340] => Array ( [1] => 1 [2] => 18 [3] => 23 ) [341] => Array ( [1] => 1 [2] => 17 [3] => 23 ) [342] => Array ( [1] =>

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

假设输出实际上应该是:

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

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

[product_id] => array (
    1 => [color_id],
    2 => [size_id],
    3 => [length_id]
)
就我个人而言,我觉得这种结构有点笨拙。产品id应该在数组中,因为它是产品的一个属性。此外,使用索引号而不是属性名称会使您的产品难以理解

现在,您要做的是,当用户选择颜色id(例如黑色)时,查找其中一个属性的所有可能组合,例如所有大小id和长度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;
}
现在,当您需要查找黑色和黑色的所有组合时,如果颜色id为0,您需要执行
查找组合ByColorID(0,$productArray)
,它将返回一个包含此颜色的所有可能大小、长度和产品id的数组

您需要编写额外的函数,以通过其他属性获得组合。您可以将finder方法设置为通用方法,但我将由您来决定如何使用它


我不明白的是,为什么要在数组级别对其进行排序。我假设您从某个地方获得可能的产品,例如数据库。那么为什么不从那里得到组合呢。这可能很简单,只要从color\u id=0的产品中选择size\u id、length\u id、product\u id,Gordon提供的答案与我想要的最接近,但考虑到我的初始数组的格式,效率不是很高。虽然我现在记不起为什么了,但我使用数组的最初目的是避免每次有人选择一个选项时都必须进行新的查询。简单的解决方法就是继续查询,这就是我要做的。

什么是有效值?我编辑了我的问题,以澄清什么是有效值。productID应该在输出数组中吗?虽然下面的一个解决方案可能有效,但我建议您创建几个类来更好地组织它。。。