使用所有可能的组合递归扩展字符串数组

时间:2017-11-08 14:03:23

标签: php arrays string recursion

我有一个问题需要解决:扩展一个字符串数组,可以包含没有逗号的字符串和带逗号的字符串:如果找到一个带逗号的元素,那么该字符串必须被拆分并递归地与所有字符串组合数组中的prev和next元素(可以包含或不包含逗号)。

考虑这个输入字符串数组:

$input = Array ( 'hello', 'world', 'we,I', 'are,am', 'alive' );

这应该转换为:

$output = Array (
   'hello world we are alive',
   'hello world we am alive',
   'hello world I are alive',
   'hello world I am alive'
);

我写的功能(有问题!)就是这个:

    /* bugged! don't consider it as working code! */
function recursiveExpandCommaDelimitedStringsArray ( $input_strings_array, $depth = 0, $this_string = '' ) {

    ksort ( $input_strings_array, SORT_NUMERIC );
    $return = Array ();
    $subarray = $input_strings_array;
    foreach ( $input_strings_array as $i => $string ) {
        unset ( $subarray[$i] );
        if ( strpos ( $string, ',' ) !== false ) {
            $substrings = array_filter ( explode ( ',', $string ), 'strlen' );
            foreach ( $substrings as $substring ) {
                $subarray[$i] = $substring;
                $return[] = recursiveExpandCommaDelimitedStringsArray ( $subarray, ++$depth, $this_string );
            }
        }
        else $this_string .= $string . ' ';
        $subarray = $input_strings_array;
    }

    if ( $depth === 0 ) return $return;
    else return $this_string;
}

找到解决方案后,我将更新此问题中的代码。 谢谢!

1 个答案:

答案 0 :(得分:1)

使用array_reducearray_map的组合可以轻松解决此问题。一个快速的解决方案是:

  • 从包含一个解决方案的数组开始:['']
  • 对于原始数组的每个单词,将该单词附加到解决方案数组中的每个解决方案
  • 如果您找到带逗号的单词,请将其展开并为爆炸数组中的每个单词创建新的解决方案
  • 重复,直到到达数组的末尾
  • 您现在将在解决方案阵列中拥有所有可能的组合

这里有(不那么优雅)代码:

<?php
$words = ['I', 'am', 'a', 'happy,sad', 'person,cat,dog', 'looking', 'for', 'a,one', 'book,pillow,thing,treat'];

$phrases = array_reduce($words, function($result, $word) {
    if (strpos($word, ',') === false) {
        return array_map(function($r) use ($word) {
            return "$r $word";
        }, $result);
    }

    $forkedWords = explode(",", $word);
    $newResults = [];
    foreach($forkedWords as $fWord) {
        $newResults[] = array_map(function($r) use ($fWord) {
            return "$r $fWord";
        }, $result);
    }

    return array_reduce($newResults, 'array_merge', []);
}, ['']);

var_dump($phrases);