【问题标题】:What is the best way to ascertain the length (in characters) of the longest element in an array?确定数组中最长元素的长度(以字符为单位)的最佳方法是什么?
【发布时间】:2010-09-25 03:27:25
【问题描述】:

确定数组中最长元素的长度(以字符为单位)的最佳方法是什么?

我需要在选择框的选项值数组中找到最长的元素,以便动态设置宽度。

【问题讨论】:

  • 在某些可变宽度字体中,当字母 i 的 10 个实例比字母 w 的 4 个实例窄时,了解每个元素中的字符数可能无济于事。

标签: php arrays


【解决方案1】:

我想我会用一种不同的、不太明显的方式来写这篇文章,见鬼去吧。

没有条件,理解这是如何工作的,是留给读者的练习。

$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 = 最大值($m, strlen($item))

因为我想与众不同。已经提供了这个答案范围。这里的想法是尝试“可视化”处理它,从逻辑上讲,我试图尽可能接近“将其打印到动态文本框中并查看文本框有多宽”的逻辑。这里唯一的问题是字符串不是二维的,所以垂直堆叠“线”是尽可能接近的。我真正想做的是像

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

但是 php 没有 LValues,而且它会很复杂并且使用糟糕的循环来实现它,所以我只是在 $length 位置用 '_' 短路了一点。

当然,您可能会争辩说这是解决问题的错误方法,但是 IMO,正在尝试的方法以及在 PHP 中解决问题的想法也是解决问题的错误方法,所以如果我要做某事错了,我也可能在可能暴露其他奇怪的编码技巧的方式上犯了创新性的错误。

另外,据我所知,$stringArray = array("")..

是的,我必须承认一个小警告,但是,如果用户有一个没有字符串或所有字符串长度为 0 的选项框,那么你一开始就有很大的失败,没有人会正确地折腾在这种情况下,选项框太大了 5 个像素。

为什么这一切都是失败的

实际上,任何没有完全成熟的字符紧缩映射将字符对与消耗的有效空间相关联的算法都是不正确的。你可以使用等宽字体,但其他任何东西都会变得很糟糕。

  • iiiiiiiii
  • llllllllll
  • 呜呜呜呜
  • mmmmmmmmmm
  • iiiiiiiii
  • llllllllll
  • 呜呜呜呜
  • mmmmmmmmmm
  • iiiiiiiiii
  • llllllllll
  • oooooooooo
  • mmmmmmmmmm

每个 10 份,但空间利用率如此多样化!

【讨论】:

  • 不初始化 $m=0 然后在循环中执行 $m = max($m, strlen($item)) 有什么意义?
  • 另外,据我所知,$stringArray = array("")...
【解决方案2】:

如果你只想要最高的价值:

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));

【讨论】:

    【解决方案3】:

    我相信这被称为high watermark algorithm。 O(n) 是最好的,除非列表已经按长度排序,否则它将是 O(1)。

    “你可以爬上拉斯维加斯的一座陡峭山丘,向西看,用正确的眼睛几乎可以看到高水位线——海浪最终破裂并回滚的地方。” - Hunter S. Thompson 博士

    【讨论】:

    • 最好使用php函数。
    • 不要相信任何使用 perl 的人
    【解决方案4】:
    $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
    【解决方案5】:

    这会返回最长值的键,也可以给你值本身

    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;
    }     
    

    【讨论】:

      【解决方案6】:

      有两种方法:

      1. 遍历整个数组并保持最大元素大小;
      2. 不遍历整个数组并从魔术帽中获取最大元素大小:-)

      然后,您必须知道您将使用什么字体来显示内容,并获取字符大小、字距和所有这些内容,以便您能够计算实际宽度除非您使用fixed width 字体,否则这些单词不是您将要显示的字符串中的字符数。

      【讨论】:

        【解决方案7】:
        $longest_length = 0;
        
        foreach($array as $key => $value
        {
            if(isset($value[$longest_length + 1]))
            {
                $longest_length = strlen($value);
            }
        }
        

        【讨论】:

          【解决方案8】:
          $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 吗?
          猜你喜欢
          • 2010-09-21
          • 1970-01-01
          • 2021-11-11
          • 1970-01-01
          • 1970-01-01
          • 2021-02-24
          • 1970-01-01
          • 1970-01-01
          • 2010-10-19
          相关资源
          最近更新 更多