use*_*072 6 php arrays string loops words
我有一个字符串$raw="aabbcdfghmnejaachto"和一个数组$word_array=array('cat','rat','goat','total','egg').
我的程序需要检查是否可以使用字符串中的字母来生成数组中的单词.有一个额外的条件; 如果单词包含多于一次的字母,则该字母必须至少在字符串中出现相同的次数.
例如egg.有两个g.如果字符串$raw不包含两个字符串g,那么就不可能生成这个单词.
这是我的预期结果:
Array([cat]=>'Yes',[rat]=>'No',[goat]=>'Yes',[total]=>'No',[egg]=>'No')
Run Code Online (Sandbox Code Playgroud)
我尝试了以下,但它没有输出预期的结果:
$res=array();
$raw="aabbcdfghmnejaachto";
$word_array=array('cat','rat','goat','total','egg');
$raw_array= str_split($raw);
foreach($word_array as $word=>$value)
{
$word_value= str_split($value);
foreach($word_value as $w=>$w_value)
{
foreach($raw_array as $raw=>$raw_value)
{
if(strcmp($w_value,$raw_value)==0)
{
$res[$value]='Yes';
}
else
{
$res[$value]='No';
}
}
}
}
print_r($res);
Run Code Online (Sandbox Code Playgroud)
编辑:最初发布的代码缺少e字符串中的字母,$raw因此egg示例实际上将返回No.我已更新问题和所有答案以反映这一点.- robinCTS
$words数组中的每个单词/元素,然后再循环遍历每个单词的每个字符.Yes.array_count_values())*作为性能优化的问题,array_count_values()在内循环上使用,以避免重复字母的任何不必要的迭代$word.该$count变量节省了必须substr_count()在if语句中进行两次调用.
代码:( 演示)
$string = "aabbcdfghmnejaachto";
$words = array('cat','rat','goat','total','egg');
foreach ($words as $word) { // iterate each word
$result[$word]='Yes'; // set default result value
foreach (array_count_values(str_split($word)) as $char=>$count) { // iterate each unique letter in word
if ($count > substr_count($string, $char)) { // compare current char's count vs same char's count in $string
$result[$word]='No'; // if more of the character in word than available in $string, set No
break; // make early exit from inner loop, to avoid unnecessary iterations
}
}
}
var_export($result);
Run Code Online (Sandbox Code Playgroud)
这是输出:
array (
'cat' => 'Yes',
'rat' => 'No',
'goat' => 'Yes',
'total' => 'No',
'egg' => 'No',
)
Run Code Online (Sandbox Code Playgroud)
BIG THANKYOU到mickmackusa为劫持显著提高这个答案.