Как лучше всего определить длину (в символах) самого длинного элемента в массиве?

Как лучше всего определить длину (в символах) самого длинного элемента в массиве?

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

Знание количества символов в каждом элементе может не помочь, когда 10 экземпляров буквы i уже 4 экземпляров буквы w в некоторых шрифтах переменной ширины.

Grant Wagner 03.12.2008 19:35
Стоит ли изучать 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
354
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Это можно сделать двумя способами:

  1. Обойти весь массив и сохранить максимальный размер элемента;
  2. Не перебирать весь массив и получить максимальный размер элемента из волшебной шляпы :-)

Затем вам нужно будет знать, какой шрифт вы будете использовать для отображения вещей, и получить размеры знаков, кернинги и все такое, чтобы вы могли вычислить реальную ширину слов, которые: если вы не используете шрифт 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?

codecowboy 04.12.2008 11:29
$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);

Он хотел найти самый длинный элемент, а не сортировать весь массив по длине элемента. Хотя хорошая функция.

philistyne 03.12.2008 18:46

@phil работает, array_pop получает последний элемент. это просто то самый медленный способ сделать это: p

Kent Fredric 03.12.2008 18:51

Я подумал, что напишу это другим, менее очевидным способом, черт возьми.

Никакие условные выражения, понимание того, как это работает, - это упражнение, оставленное читателю.

$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 пикселей в данном случае.

Почему все сделано из провала

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

  • iiiiiiiiii
  • llllllllll
  • оооооооооо
  • мммммммммм
  • iiiiiiiiii
  • llllllllll
  • оооооооооо
  • мммммммммм
  • iiiiiiiiii
  • llllllllll
  • oooooooooo
  • mmmmmmmmmm

По 10 экземпляров каждого, но какое разнообразие использования пространства!

Какой смысл не инициализировать $ m = 0, а затем в цикле выполнить $ m = max ($ m, strlen ($ item))?

Jonas Due Vesterheden 04.12.2008 02:27

Кроме того, насколько я понимаю, ваша функция будет неправильной для $ stringArray = array ("") ...

Jonas Due Vesterheden 04.12.2008 02:31

Если вам просто нужно максимальное значение:

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.

OIS 03.12.2008 18:49

и не доверять никому, кто использует perl

codecowboy 04.12.2008 11:34

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