Каков наилучший способ определить длину (в символах) самого длинного элемента в массиве? - PullRequest
2 голосов
/ 03 декабря 2008

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

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

Ответы [ 8 ]

3 голосов
/ 03 декабря 2008

Если вы просто хотите самое высокое значение:

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));
2 голосов
/ 03 декабря 2008

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

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

$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 в массив. Чистый Гений.

Ответ на комментарий

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

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

 substr( $m , 0 , strlen($item)) = $item; 

Но php не имеет значений LVal, и он был бы сложен и использовал бы ужасные циклы для реализации этого, поэтому я просто немного замкнул '_' в позиции $ length.

Конечно, вы можете утверждать, что это неправильный подход к проблеме, но IMO, то, что предпринимается, и идея ее решения в PHP - это тоже неправильный подход к проблеме, поэтому, если я собираюсь что-то сделать неправильно, я также могу быть новаторски неправым в способах, которые могут раскрыть другие странные трюки кодирования.

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

Да, незначительное предостережение, которое я должен признать, однако, если у пользователя есть поле с опциями без строк или все строки имеют длину 0, у вас не получится начать с того, что nobodys собирается правильно дать команду, что В этом случае поле параметров слишком велико на 5 пикселей.

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

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

  • iiiiiiiiii
  • LLLLLLLLLL
  • OOOOOOOOOO
  • ммммммммммы
  • iiiiiiiiii
  • LLLLLLLLLL
  • OOOOOOOOOO
  • ммммммммммы
  • iiiiiiiiii
  • llllllllll
  • oooooooooo
  • mmmmmmmmmm

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

1 голос
/ 03 декабря 2008

Возвращает ключ самого длинного значения, а также может дать вам само значение

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;
}     
1 голос
/ 03 декабря 2008
$longval = 0;
$index = -1;

for($i = 0; $i < count($array); $i++)  {
   if($len = strlen($array[$i]) > $longval) { 
       $longval = $len;
       $index = $i;
   }
}

Тогда вы знаете, $array[$index] имеет самый длинный элемент длины $longval

1 голос
/ 03 декабря 2008

Есть два способа сделать это:

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

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

0 голосов
/ 03 декабря 2008

Я считаю, что это называется алгоритм водяного знака . O (n) - лучшее, что вы получите за это, если список уже не отсортирован по длине, тогда это будет O (1).

«Вы можете подняться на крутой холм в Лас-Вегасе и посмотреть на запад, и с правильными глазами вы почти сможете увидеть отметку прилива - место, где волна наконец сломалась и откатилась назад». - Доктор Хантер С. Томпсон

0 голосов
/ 03 декабря 2008
$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);
0 голосов
/ 03 декабря 2008
$longest_length = 0;

foreach($array as $key => $value
{
    if(isset($value[$longest_length + 1]))
    {
        $longest_length = strlen($value);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...