PHP Получить самую длинную строку в массиве без цикла

Учитывая массив, я хочу получить самую длинную строку по длине без использования цикла foreach.

Ниже мой массив

$array = array(
    'Google',
    'Facebook',
    'Twitter',
    'Slack',
    'Twilio',
);

Этот вопрос возвращает максимальную длину, но я хочу получить значение строки. PHP самая короткая/длинная строка в массиве

Что происходит, когда несколько элементов связаны для максимальной длины?

mickmackusa 13.07.2019 12:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
1
1 250
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете использовать array_walk, чтобы получить длину каждого элемента массива, чем использовать array_search с max, чтобы получить элемент наибольшей длины.

$r = null;
array_walk($array, function($v) use (&$r){
  $r[$v] = strlen($v);
});
echo array_search(max($r), $r);

Живой пример: https://3v4l.org/ETf9F

Спасибо, но я выбрал другой ответ, так как он был компактным.

100r0bh 13.07.2019 11:09

@ 100r Другой может иметь на 1 строку кода меньше, но он выполняет 2 strlen() вызова на итерацию всех элементов (n * 2). Этот ответ вызывает strlen() n*1, затем запускает второй цикл (array_search()) с ранней точкой останова (что может быть еще одним полным n итераций).

mickmackusa 13.07.2019 12:49

Given an array, I want to get the longest string by length without using the foreach loop.

Без использования цикла foreach (или, например, любого цикла) невозможно получить данные. Обертки, такие как array_filter, array_map и т. д., делают петлю под капотом. Расширяя отвечать, который вы связали, вы можете просто использовать фильтр_массива для фильтрации строк с наибольшей длиной.

<?php 

$data =  array(
    'Google',
    'Facebook',
    'Twitter',
    'Slack',
    'Twilio',
);

$lengths = array_map('strlen', $data);

$max_len = max($lengths);

$longest_strings = array_filter($data,function($value) use ($max_len){
    return strlen($value) === $max_len;
});

print_r($longest_strings);
Ответ принят как подходящий

Вы можете отсортировать строки по длине, используя, например, усортировать, и получить первый элемент, используя сброс настроек.

$array = array(
    'Google',
    'Facebook',
    'Twitter',
    'Slack',
    'Twilio',
);

usort($array, function ($a, $b) {
    return strlen($a) < strlen($b);
});

echo reset($array); // Facebook

Если бы могло быть больше строк одинаковой длины, вы могли бы использовать foreach и выйти из цикла, когда длина не равна текущей длине элемента, чтобы предотвратить зацикливание всего списка.

$item = reset($array);
$result = [];

if ($item) {
    $len = strlen($item);
    foreach($array as $value) {
        if (strlen($value) === $len) {
            $result[] = $value;
            continue;
        }
        break;
    }
}

print_r($result);

Результат

Array
(
    [0] => Facebook
    [1] => Test1112
)

демонстрация Php

Хотя это решение подходит для опубликованного образца ввода, оно не учитывает возможность того, что ввод может содержать несколько значений, которые имеют общую максимальную длину.

mickmackusa 13.07.2019 13:27

@micmackusa Верно, я добавил возможное решение для нескольких строк.

The fourth bird 13.07.2019 13:32

Это самое длинное решение еще не предоставлено vivek_23? Подождите, вы хотите перебрать массив с помощью usort(), который вызывает strlen() два раза за итерацию, затем вызывает array_filter(), чтобы снова перебрать все элементы, и вызывает strlen() еще два раза за итерацию?!? Вы бы на самом деле не использовали такое решение, не так ли? Почему вы рекомендуете такую ​​технику кому-либо? Исследователи с большей вероятностью будут слепо доверять вашим ответам из-за вашего высокого количества повторений — я думаю, вы обязаны предоставить наилучшее возможное решение.

mickmackusa 13.07.2019 14:05

@micmackusa Я пропустил, что у vivek_23 было такое же решение с использованием array_filter. Я обновил его, чтобы вычислить strlen один раз и выйти из foreach, когда длины больше не равны.

The fourth bird 13.07.2019 15:00

Я нахожу ограничение «без цикла foreach» безумно строгим. В конце концов, вам нужно перебрать массив, чтобы выполнить этот процесс. Любой синтаксис, который вы выберете, в любом случае должен будет «зацикливаться» под капотом.

По этой причине я отбрасываю ваше ограничение, чтобы показать вам чистый и эффективный подход, который не делает чрезмерных вызовов функций И ​​учитывает возможность нескольких «самых длинных» значений.

Код: (Демо)

$array = array(
    'Google',
    'Facebook',
    'Twitter',
    'Slack',
    'Twilio',
    'Bookface'
);
$cachedLength = 0;
$longest = [];

foreach ($array as $value) {
    $currentLength = strlen($value);
    if ($currentLength > $cachedLength) {
        $longest = [$value];
        $cachedLength = $currentLength;
    } elseif ($currentLength == $cachedLength) {
        $longest[] = $value;
    }
}
var_export($longest);

Выход:

array (
  0 => 'Facebook',
  1 => 'Bookface',
)

Чтобы уточнить, $longest = [$value]; объявляет (или перезаписывает ранее объявленный) массив $longest. При этом вы никогда не увидите меньших значений, помещенных в массив.

Если последующее значение имеет ту же длину, что и сохраненное в $longest, то $longest[] = $value; помещает его в выходной массив.

Этот фрагмент будет вызывать strlen() только один раз для каждого элемента. Нет дополнительных вызовов функций для получения желаемого результата. Это подход, который я бы использовал, если бы это был профессиональный проект.

Другие вопросы по теме