





Это можно сделать двумя способами:
Затем вам нужно будет знать, какой шрифт вы будете использовать для отображения вещей, и получить размеры знаков, кернинги и все такое, чтобы вы могли вычислить реальную ширину слов, которые: если вы не используете шрифт fixed width, это не количество знаков в строке, которую вы будете отображать.
$longval = 0;
$index = -1;
for($i = 0; $i < count($array); $i++) {
if ($len = strlen($array[$i]) > $longval) {
$longval = $len;
$index = $i;
}
}
Тогда вы знаете, что $array[$index] имеет самый длинный элемент длины $longval.
Спасибо - не могли бы вы объяснить, почему вы установили для $ index значение -1?
$longest_length = 0;
foreach($array as $key => $value
{
if (isset($value[$longest_length + 1]))
{
$longest_length = strlen($value);
}
}
Это возвращает ключ самого длинного значения, а также может дать вам само значение
function array_longest_value( $array, &$val = null )
{
$val = null;
$result = null;
foreach( array_keys( $array ) as $i )
{
$l = strlen( $array[ $i ] );
if ( $l > $result )
{
$result = $i;
$val = $array[ $i ];
}
}
return $result;
}
$array = array('andy', 'patrick', 'mat', 'perenenappels');
function len_sort($a, $b) {
return strlen($a) > strlen($b) ? 1 : 0;
}
usort($array, 'len_sort');
echo array_pop($array);
Он хотел найти самый длинный элемент, а не сортировать весь массив по длине элемента. Хотя хорошая функция.
@phil работает, array_pop получает последний элемент. это просто то самый медленный способ сделать это: p
Я подумал, что напишу это другим, менее очевидным способом, черт возьми.
Никакие условные выражения, понимание того, как это работает, - это упражнение, оставленное читателю.
$x = array(
'foo ', 'bar ____' , 'baz', 'q-----------', 'doo'
);
function max_str( $stringArray )
{
$m = '_';
foreach($stringArray as $item )
{
$m[ strlen($item) ] = '_';
}
return strlen( $m );
}
print max_str( $x );
Примечание: Установка $m как просто "" не работает. Php отстой и почему-то закидывает $m в массив. Чистый гений.
What's the point of not initializing $m=0 and then in the loop do $m = max($m, strlen($item))
Потому что я хотел быть другим. Такой объем ответа был предоставлен. Идея заключалась в том, чтобы попытаться «визуально» обработать его, в логическом смысле я пытался максимально приблизиться к логике «распечатать его в динамическом текстовом поле и посмотреть, насколько широкое текстовое поле». Единственная проблема здесь в том, что струны не двухмерные, поэтому вертикальное наложение «линий» было настолько точным, насколько я мог. Что я действительно хотел сделать, это что-то вроде
substr( $m , 0 , strlen($item)) = $item;
Но php не имеет значений LV, и для реализации этого было бы сложно использовать ужасные циклы, поэтому я просто немного замкнул короткое замыкание с помощью '_' в позиции $ length.
Конечно, вы можете возразить, что это неправильный подход к проблеме, но ИМО, то, что предпринимается, и идея решения этого в PHP также является неправильным подходом к проблеме, поэтому, если я собираюсь сделать что-то не так, я может также быть инновационно неправильным в том смысле, что может обнажить другие странные трюки кодирования.
Also, as far as I can see your function will be wrong for $stringArray = array("")..
Да, небольшая оговорка, которую я должен признать, однако, если у пользователя есть поле выбора без строк или все строки имеют нулевую длину, у вас большой провал для начала, никто не собирается справедливо заявить, что поле выбора слишком большой на 5 пикселей в данном случае.
На самом деле, любой алгоритм, не имеющий полноценной карты кернинга символов, коррелирующей пары символов с эффективным потребляемым пространством, будет неверным. У вас все в порядке с моноширинным шрифтом, но все остальное будет сложно.
iiiiiiiiiilllllllllloooooooooommmmmmmmmmПо 10 экземпляров каждого, но какое разнообразие использования пространства!
Какой смысл не инициализировать $ m = 0, а затем в цикле выполнить $ m = max ($ m, strlen ($ item))?
Кроме того, насколько я понимаю, ваша функция будет неправильной для $ stringArray = array ("") ...
Если вам просто нужно максимальное значение:
echo max(array_map('strlen', $arr));
Если вам нужны самые длинные значения:
function array_longest_strings(array $arr)
{
$arr2 = array_map('strlen', $arr);
$arr3 = array_intersect($arr2, array(max($arr2)));
return array_intersect_key($arr, $arr3);
}
print_r(array_longest_strings($arr));
Я считаю, что это называется алгоритм высокого водяного знака. O (n) - лучшее, что вы можете получить для этого, если список уже не отсортирован по длине, тогда это будет O (1).
«Вы можете подняться на крутой холм в Лас-Вегасе и посмотреть на запад, и правильным взглядом вы почти сможете увидеть отметку прилива - место, где волна наконец сломалась и откатилась назад». - Доктор Хантер С. Томпсон
Лучше использовать функции php.
и не доверять никому, кто использует perl
Знание количества символов в каждом элементе может не помочь, когда 10 экземпляров буквы i уже 4 экземпляров буквы w в некоторых шрифтах переменной ширины.