Учитывая массив, я хочу получить самую длинную строку по длине без использования цикла foreach.
Ниже мой массив
$array = array(
'Google',
'Facebook',
'Twitter',
'Slack',
'Twilio',
);
Этот вопрос возвращает максимальную длину, но я хочу получить значение строки. PHP самая короткая/длинная строка в массиве






Вы можете использовать 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
Спасибо, но я выбрал другой ответ, так как он был компактным.
@ 100r Другой может иметь на 1 строку кода меньше, но он выполняет 2 strlen() вызова на итерацию всех элементов (n * 2). Этот ответ вызывает strlen() n*1, затем запускает второй цикл (array_search()) с ранней точкой останова (что может быть еще одним полным n итераций).
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
)
Хотя это решение подходит для опубликованного образца ввода, оно не учитывает возможность того, что ввод может содержать несколько значений, которые имеют общую максимальную длину.
@micmackusa Верно, я добавил возможное решение для нескольких строк.
Это самое длинное решение еще не предоставлено vivek_23? Подождите, вы хотите перебрать массив с помощью usort(), который вызывает strlen() два раза за итерацию, затем вызывает array_filter(), чтобы снова перебрать все элементы, и вызывает strlen() еще два раза за итерацию?!? Вы бы на самом деле не использовали такое решение, не так ли? Почему вы рекомендуете такую технику кому-либо? Исследователи с большей вероятностью будут слепо доверять вашим ответам из-за вашего высокого количества повторений — я думаю, вы обязаны предоставить наилучшее возможное решение.
@micmackusa Я пропустил, что у vivek_23 было такое же решение с использованием array_filter. Я обновил его, чтобы вычислить strlen один раз и выйти из foreach, когда длины больше не равны.
Я нахожу ограничение «без цикла 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() только один раз для каждого элемента. Нет дополнительных вызовов функций для получения желаемого результата. Это подход, который я бы использовал, если бы это был профессиональный проект.
Что происходит, когда несколько элементов связаны для максимальной длины?