我有一个问题需要解决:扩展一个字符串数组,可以包含没有逗号的字符串和带逗号的字符串:如果找到一个带逗号的元素,那么该字符串必须被拆分并递归地与所有字符串组合数组中的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;
}
找到解决方案后,我将更新此问题中的代码。 谢谢!
答案 0 :(得分:1)
使用array_reduce
和array_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);