Как оптимально из массива выбрать самые длинней строки?

330
19 июня 2017, 22:00

Есть массив со строками:

  1. $inputArray = ["aba", "aa", "ad", "vcd", "aba"];
  2. $inputArray = ["aa", "bbbb", "cc", "yyyy", "j"];
  3. $inputArray = ["aaaaa", "ss", "yyyyy", "u", "ooooo"];

Вопрос: Как получить массив в результате с самыми длинными строками ?

Ожидаемый результат

  1. = [aba, vcd, aba]
  2. = ["bbbb", "yyyy"]
  3. = ["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)); 
Answer 1

Не знаю как оптимально из массива выбрать самые длинней строки, но как вариант, чуть сокращенный:

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]; 
}
Answer 2
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);  // Перенумеруем оставшиеся
}
Answer 3

По моему хороший вариант:

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;
}
READ ALSO
api rest яндекс диск создать папку

api rest яндекс диск создать папку

пытаюсь создать паку на диске в результате получаю такую ошибку помогите исправить {"message":"Метод не поддерживается","description":"Method Not Allowed","error":"MethodNotAllowedError"}...

429
Переход на страницу по id

Переход на страницу по id

При нажатии на кнопку поста выдает ошибку 404Как должен выглядеть маршрут к посту

231
Повесить хук на событие &ldquo;Обновить&rdquo; в Страницы-&gt;Редактировать страницу

Повесить хук на событие “Обновить” в Страницы->Редактировать страницу

Собственно надо, чтобы при нажатии на кнопку "Обновить" в админке WP Страницы->Редактировать страницу срабатывала своя функция, которая проверяет,...

211
PHP единая точка входа?

PHP единая точка входа?

Здравствуйте, делаю единую точку входа(подключаю страницы) и не могу реализовать такоеИмею вот такой код в файле index

428