首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PHP创建每个元素组合的最佳方法

使用PHP创建每个元素组合的最佳方法
EN

Stack Overflow用户
提问于 2018-09-15 16:11:31
回答 3查看 52关注 0票数 1

这是我的数组:

代码语言:javascript
复制
[options] => Array
    (
        [1] => Array
            (
                [0] => Red
                [1] => Yellow
                [2] => Blue
                [3] => Green
            )

        [2] => Array
            (
                [0] => 28
                [1] => 30
                [2] => 32
                [3] => 34
            )

        [3] => Array
            (
                [0] => Short Neck
                [1] => Full Neck
                [2] => Round Neck
            )

        [5] => Array
            (
                [0] => Bodycon
                [1] => Empire Waist
                [2] => High-Low
            )

    )

想要创建这样的字符串:

红-28-短颈-体形

红-28-短颈-帝国腰

红-28-短颈-高-低

红-28-全颈-体形

红-28-全颈-帝国腰部

红-28-全颈-高-低

红-28-圆颈-体形

红-28-圆领-帝国腰部

红-28-圆颈-高-低

红-30-短颈-体形

红-30-短颈-帝国腰部

红-30-短颈-高-低

红-30-全颈-体形

红-30-全颈-帝国腰部

红-30-全颈-高-低

红-30-圆颈-体形

红-30-圆领-帝国腰部

红-30-圆颈-高-低

等等..。

对于每一个价值

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-15 16:49:32

可以使用递归函数构建结果数组,例如:

代码语言:javascript
复制
function combine($arr) {
    if (count($arr) === 1) {
        return array_shift($arr);
    } 
    $items = array_shift($arr);

    $data = [];
    foreach ($items as $item) {
        foreach (combine($arr) as $value) {
            $data[] = $item . ' ' . $value;
        }
    } 
    return $data;
}

并使用实例:

代码语言:javascript
复制
$items = [
    [            
        'Red',
        'Yellow',
        'Blue',
        'Green',
    ],
    [
        28,
        30,
        32,
        34
    ],
    [
        'Short Neck',
        'Full Neck',
        'Round Neck'
    ],
    [
        'Bodycon',
        'Empire Waist',
        'High-Low'
    ]
];

$result = combine($items);
票数 1
EN

Stack Overflow用户

发布于 2018-09-15 16:44:14

您可以在注释中的线程中使用笛卡儿()函数,或者像这样的简单例程:

代码语言:javascript
复制
$join = [];
foreach( $myarray[ 'options' ] as $block ) :

    foreach( $block as $i => $value ) :

        $join[ $i ][] = $value;

    endforeach;

endforeach;

foreach( $join as $string ) :

    echo implode( '-', $string ) . '<br>';

endforeach;

输出:

代码语言:javascript
复制
Red-28-Short Neck-Bodycon
Yellow-30-Full Neck-Empire Waist
Blue-32-Round Neck-High-Low
Green-34

不是很漂亮,但应该完成单个用例的工作。

票数 0
EN

Stack Overflow用户

发布于 2018-09-15 17:43:17

考虑到你的数组:

代码语言:javascript
复制
$items = [
    1=>[            
        'Red',
        'Yellow',
        'Blue',
        'Green',
    ],
    2=>[
        28,
        30,
        32,
        34
    ],
    3=>[
        'Short Neck',
        'Full Neck',
        'Round Neck'
    ],
    5=>[
        'Bodycon',
        'Empire Waist',
        'High-Low'
    ]
];

这是实现这一目标的最简单、消耗更少的方法。

代码语言:javascript
复制
$items=array_values($items);
$result=[];


foreach($items[0] as $k1=>$v1){
    foreach($items[1] as $k2=>$v2){
        foreach($items[2] as $k3=>$v3){
            foreach($items[3] as $k4=>$v4){
                $result[]=$v1.' '.$v2.' '.$v3.' '.$v4;
            }
        }
    }   
}

如果您想要从上面的代码中删除一个步骤,则可以使用

代码语言:javascript
复制
$result=[];


    foreach($items[1] as $k1=>$v1){
        foreach($items[2] as $k2=>$v2){
            foreach($items[3] as $k3=>$v3){
                foreach($items[5] as $k4=>$v4){
                    $result[]=$v1.' '.$v2.' '.$v3.' '.$v4;
                }
            }
        }   
    }

请注意,我们删除了array_values的步骤

这些代码以预期的顺序输出144个条目的数组,表示所有组合。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52346501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档