Мне нужно найти / вычислить 1 слово из списка из 20 слов с соблюдением следующих условий:
Вот 20 слов, которые у меня есть:
$words = array( 'MVW',
'MWAH',
'MWAH',
'MYW',
'MW',
'MY9AH',
'MYQAH',
'MYQAH',
'MY9AH',
'MYQAH',
'MYQAH',
'MWAH',
'MYQAH',
'MYSWI',
'MYQAH',
'MYQAH',
'MW',
'MW',
'MW',
'MW');
Мне нужно посчитать символы в строке и найти наибольшее число символов, чтобы получить такой результат:
1. char is: M - occurred 20 times as 1. character in words.
2. char is: Y - 11 times.
3. char is: Q - 7 times.
4. char is: A - 10 times.
5. char is: H - 9 times.
Результат от Array $ words, который я хочу получить: MYQAH
Я пробовал этот код:
<?php
$words = array( 'MVW',
'MWAH',
'MWAH',
'MYW',
'MW',
'MY9AH',
'MYQAH',
'MYQAH',
'MY9AH',
'MYQAH',
'MYQAH',
'MWAH',
'MYQAH',
'MYSWI',
'MYQAH',
'MYQAH',
'MW',
'MW',
'MW',
'MW');$newarray = array();
$cc2 = 0;
$cc3 = 0;
$cc4 = 0;
$cc5 = 0;
$cc6 = 0;
foreach($words as $run) {
if (isset($run['1']) && !isset($run['2'])) {
$newarray[] = array($run['0'],$run['1']);
$cc2++;
}
if (isset($run['2']) && !isset($run['3'])) {
$newarray[] = array($run['0'],$run['1'],$run['2']);
$cc3++;
}
if (isset($run['3']) && !isset($run['4'])) {
$newarray[] = array($run['0'],$run['1'],$run['2'],$run['3']);
$cc4++;
}
if (isset($run['4']) && !isset($run['5'])) {
$newarray[] = array($run['0'],$run['1'],$run['2'],$run['3'],$run['4']);
$cc5++;
}
if (isset($run['5']) && !isset($run['6'])) {
$newarray[] = array($run['0'],$run['1'],$run['2'],$run['3'],$run['4'],$run['5']);
$cc6++;
}
}
echo "Length / Found words<br>\n";
echo "2 chars / $cc2<br>\n";
echo "3 chars / $cc3<br>\n";
echo "4 chars / $cc4<br>\n";
echo "5 chars / $cc5<br>\n";
echo "6 chars / $cc6<br>\n";
echo "<pre>";
var_dump($newarray);
echo "</pre>";
?>
И я получаю такие результаты:
Length / Found words
2 chars / 5
3 chars / 2
4 chars / 3
5 chars / 10
6 chars / 0
array(20) {
[0]=>
array(3) {
[0]=>
string(1) "M"[1]=>
string(1) "V"[2]=>
string(1) "W"}
[1]=>
array(4) {
[0]=>
string(1) "M"[1]=>
string(1) "W"[2]=>
string(1) "A"[3]=>
string(1) "H"}
[2]=>
array(4) {
[0]=>
string(1) "M"[1]=>
string(1) "W"[2]=>
string(1) "A"[3]=>
string(1) "H"}
[3]=>
array(3) {
[0]=>
string(1) "M"[1]=>
string(1) "Y"[2]=>
string(1) "W"}
[4]=>
array(2) {
[0]=>
string(1) "M"[1]=>
string(1) "W"}
[5]=>
array(5) {
[0]=>
string(1) "M"[1]=>
string(1) "Y"[2]=>
string(1) "9"[3]=>
string(1) "A"[4]=>
string(1) "H"}
[6]=>
array(5) {
[0]=>
string(1) "M".........
ВопросКакой лучший способ получить результат: MYQAH
из слов выше в массиве?
Большое спасибо за помощь.
У меня есть умный маленький лайнер для вас!
Код: (демонстрация)
echo implode(
array_map(function(){
$occurrences=count_chars(implode(func_get_args()),1);
arsort($occurrences);
return chr(key($occurrences));
},
...array_map('str_split',$words)
)
);
Выход:
MYQAH
Разбивка 🙁 Я не буду раздувать эту страницу со всеми результатами, перейдите к этому демонстрация)
$words=['MVW','MWAH','MWAH','MYW','MW','MY9AH','MYQAH','MYQAH','MY9AH','MYQAH',
'MYQAH','MWAH','MYQAH','MYSWI','MYQAH','MYQAH','MW','MW','MW','MW'];
echo "*** Step #1: Replace each word with an array of its characters ***\n";
var_export(array_map('str_split',$words));
echo "\n\n---\n\n";
echo "*** Step #2: Pass the characters through array_map with the splat operator and func_get_args() to isolate columnar data including NULLs where no character exists in the column ***\n";
var_export(array_map(function(){return func_get_args();},...array_map('str_split',$words)));
echo "\n\n---\n\n";
echo "*** Step #3: Convert column data to strings with the added benefit of eliminating NULLs ***\n";
//var_export(array_map(function(){return implode(func_get_args());},...array_map('str_split',$words)));
echo "\n\n---\n\n";
echo "*** Step #4: Count the occurrences of each character; stored as ord values as keys, and occurrences as values ***\n";
var_export(array_map(function(){return count_chars(implode(func_get_args()),1);},...array_map('str_split',$words)));
echo "\n\n---\n\n";
echo "*** Step #5: Sort DESC while preserving keys ***\n";
var_export(array_map(function(){$occurrences=count_chars(implode(func_get_args()),1); arsort($occurrences); return $occurrences;},...array_map('str_split',$words)));
echo "\n\n---\n\n";
echo "*** Step #6: Target the first (highest occurring) value/character in the array ***\n";
var_export(array_map(function(){$occurrences=count_chars(implode(func_get_args()),1); arsort($occurrences); return key($occurrences);},...array_map('str_split',$words)));
echo "\n\n---\n\n";
echo "*** Step #7: Convert the targeted character from ord() to chr() ***\n";
var_export(array_map(function(){$occurrences=count_chars(implode(func_get_args()),1); arsort($occurrences); return chr(key($occurrences));},...array_map('str_split',$words)));
постскриптум Чтобы выделить «причудливый трюк» вращения массива букв «90 градусов», взгляните на этот другой пост, где я использую тот же метод.
Это тот же общий метод, использующий конструкцию цикла, которая будет более щадящей для более ранних версий PHP:
Код: (демонстрация)
$words=['MVW','MWAH','MWAH','MYW','MW','MY9AH','MYQAH','MYQAH','MY9AH','MYQAH',
'MYQAH','MWAH','MYQAH','MYSWI','MYQAH','MYQAH','MW','MW','MW','MW'];
$chars=array_map('str_split',$words);
usort($chars,function($a,$b){return sizeof($b)-sizeof($a);});
$result='';
foreach($chars[0] as $col=>$not_used){
$occurrences=array_count_values(array_column($chars,$col)); // no NULL values
arsort($occurrences);
$result.=key($occurrences);
}
echo $result; // same output: MYQAH
Других решений пока нет …