массивы — PHP подсчитывает количество символов в 20 словах и сравнивает их, чтобы вычислить / найти ключевое слово

Мне нужно найти / вычислить 1 слово из списка из 20 слов с соблюдением следующих условий:

  1. Если самое длинное слово в массиве — 5 символов, то результатом будет 5 символов. (Слово, которое я ищу, всегда будет 4, 5 или 6 символов.)
  2. Посчитайте / узнайте каждый символ и его положение в слове для последующего расчета.
  3. Слова в массиве содержат заглавные буквы A-Z и / или цифры 0-9.

Вот 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 из слов выше в массиве?

Большое спасибо за помощь.

1

Решение

У меня есть умный маленький лайнер для вас!

Код: (демонстрация)

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
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector