Есть массив со строками:
$inputArray = ["aba", "aa", "ad", "vcd", "aba"];
$inputArray = ["aa", "bbbb", "cc", "yyyy", "j"];
$inputArray = ["aaaaa", "ss", "yyyyy", "u", "ooooo"];
Вопрос: Как получить массив в результате с самыми длинными строками ?
Ожидаемый результат
= [aba, vcd, aba]
= ["bbbb", "yyyy"]
= ["aaaaa", "yyyyy", "ooooo"]
Решил не очень оптимально:
На мой взгляд можно обойти без использовании функции array_filter()
и array_values()
.
function allLongestStrings(array $inputArray)
{
if(!$inputArray)
return [];
$arr = [];
$first = $inputArray[0];
for ($i = 0, $cnt = count($inputArray); $i < $cnt; $i++)
{
if(strlen($inputArray[$i]) >= strlen($first))
{
$arr[] = $first = $inputArray[$i];
$arr = array_filter($arr, function($v) use ($first){
if(strlen($v) >= strlen($first))
return strlen($v);
});
}
}
return array_values($arr);
}
$inputArray = ["aba", "aa", "ad", "vcd", "aba"];
echo '<pre>';
print_r(allLongestStrings($inputArray));
$inputArray = ["aba", "eeee", "ffff", "yyyy", "o"];
print_r(allLongestStrings($inputArray));
$inputArray = ["abc", "eeee", "abcd", "dcd"];
print_r(allLongestStrings($inputArray));
Не знаю как оптимально из массива выбрать самые длинней строки, но как вариант, чуть сокращенный:
function allLongestStrings(array $inputArray) {
if(!$inputArray)
return [];
$maxLength = max(array_map('strlen', $inputArray));
return array_filter($inputArray, function($v) use($maxLength){
return strlen($v) == $maxLength;
});
}
Еще какой-то набросок:
function allLongestStrings(array $inputArray) {
$cnt = count($inputArray);
$output = [];
$max = $inputArray[0];
for ($i = 0; $i < $cnt; ++$i) {
$len = strlen($inputArray[$i]);
if ($len > $max) $max = $len;
if (!isset($output[$len]))
$output[$len] = [];
$output[$len][] = $inputArray[$i];
}
return $output[$max];
}
function allLongestStrings(array $input)
{
if(!$input) return [];
$i=count($input)-1;
if($i==0) return $input; // В массиве 1 элемент - вернуть его
$len=strlen($input[$i--]); // Длина последнего элемента
$last=0; // Первый элемент для удаления
for(;$i>=0;$i--) { // Цикл с предпоследнего элемента
$clen=strlen($input[$i]);
if($clen < $len) { // Если текущий элемент короче
unset($input[$i]); // Удаляем его
} elseif($clen > $len) { // Если длиннее
$last=$i; // запоминаем его позицию - за ним все элементы короче
$len=$clen; // Сохраняем новую максимальную длину
}
}
if($last) array_splice($input,$last+1); // Удаляем короткие элементы с конца
return array_values($input); // Перенумеруем оставшиеся
}
По моему хороший вариант:
function allLongestStrings($inputArray) {
$longestLen = 0;
$longestArray = [];
foreach($inputArray as $str) {
$len = strlen($str);
if($len > $longestLen) {
$longestArray = [$str];
$longestLen = $len;
}
else if ($len == $longestLen) {
$longestArray[] = $str;
}
}
return $longestArray;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
пытаюсь создать паку на диске в результате получаю такую ошибку помогите исправить {"message":"Метод не поддерживается","description":"Method Not Allowed","error":"MethodNotAllowedError"}...
При нажатии на кнопку поста выдает ошибку 404Как должен выглядеть маршрут к посту
Собственно надо, чтобы при нажатии на кнопку "Обновить" в админке WP Страницы->Редактировать страницу срабатывала своя функция, которая проверяет,...
Здравствуйте, делаю единую точку входа(подключаю страницы) и не могу реализовать такоеИмею вот такой код в файле index