确定数组中最长元素的长度(以字符为单位)的最佳方法是什么?
我需要在选择框的选项值数组中找到最长的元素,以便我可以动态设置宽度。
答案 0 :(得分:3)
如果您只想要最高价值:
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));
答案 1 :(得分:2)
我以为我会用一种不同的,不太明显的方式来写这个,因为它的地狱。
没有条件,理解这是如何工作的,是一个留给读者的练习。
$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没有LValues,而且它会很复杂并且使用了糟糕的循环来实现它,所以我只是在$ length位置用'_'短路了一点。
当然,你可能会认为这是解决问题的错误方法,但IMO,正在尝试的内容以及在PHP中解决它的想法也是解决问题的错误方法,所以如果我要做某事错了,我可能在创新上错误的方式可能会暴露其他奇怪的编码技巧。
另外,据我所知,你的函数对于$ stringArray = array(“”)来说是错误的..
是的,一个小小的警告我必须承认,但是,如果用户有一个没有字符串的选项框或所有字符串的长度为0,那么你有一个很大的失败开始,nobodys正确地给了一个折腾,在这种情况下,选项框太大了5个像素。
实际上,任何没有完全成熟的字符字距调整图将任意字符对与消耗的有效空间相关联的算法都是不正确的。你可以使用等宽字体,但其他任何东西都会很糟糕。
iiiiiiiiii
llllllllll
oooooooooo
mmmmmmmmmm
答案 2 :(得分:1)
有两种方法可以做到:
然后,你必须知道你将使用什么字体来显示东西,并获得字符大小,字距和所有这些东西,以便你能够计算出真实的宽度。除非您使用的是fixed width
字体,否则这些字词不是您要显示的字符串中的字符数。
答案 3 :(得分:1)
$longval = 0;
$index = -1;
for($i = 0; $i < count($array); $i++) {
if($len = strlen($array[$i]) > $longval) {
$longval = $len;
$index = $i;
}
}
然后您知道$array[$index]
具有最长的元素$longval
答案 4 :(得分:1)
这将返回最长值的键,并且还可以为您提供值
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;
}
答案 5 :(得分:0)
$longest_length = 0;
foreach($array as $key => $value
{
if(isset($value[$longest_length + 1]))
{
$longest_length = strlen($value);
}
}
答案 6 :(得分:0)
$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);
答案 7 :(得分:0)
我相信这被称为high watermark algorithm。 O(n)是你要获得的最好的,除非列表按长度排序然后它将是O(1)。
“你可以在拉斯维加斯的一个陡峭的山坡上,看向西方,用正确的眼睛,你几乎可以看到高水位 - 波浪最终破裂并回滚的地方。” - Hunter S. Thompson博士