PHP数组中最短/最长字符串长度

PHP数组中最短/最长字符串长度,php,arrays,string,string-length,Php,Arrays,String,String Length,我有一个像这样的数组 $data = array( "163", "630", "43", "924", "4", "54" ); 如何根据字符串长度而不是数字值从中选择最小值和最大值(本例中为1(最小)和3(最大)$min=100; $max=-1; foreach($a数据){ $length=strlen($a); 如果($length>$max){$max=$length;} 如果($length

我有一个像这样的数组

$data = array(
    "163",
    "630",
    "43",
    "924",
    "4",
    "54"
);
如何根据字符串长度而不是数字值从中选择最小值和最大值(本例中为1(最小)和3(最大)

$min=100;
$max=-1;
foreach($a数据){
$length=strlen($a);
如果($length>$max){$max=$length;}
如果($length<$min){$min=$length;}
}

以下是一个改进版:


虽然在这种情况下不建议这样做,因为您将遍历数组两次,但也可以使用将每个元素与其余元素进行比较。如下所示:

<?php

$data = array('163','630','43','42','999','31');
//Will return the longest element that is nearest to the end of the array (999)
//That's why we use strlen() on the result.
$max_l = strlen(array_reduce($data,'maxlen'));
//Will return the shortest element that is nearest to the end of the array (31)
$min_l = strlen(array_reduce($data,'minlen'));

echo "The longest word is $max_l characters, while the shortest is $min_l\n";

function maxlen($k,$v) {
        if (strlen($k) > strlen($v)) return $k;
        return $v;
}
function minlen($k,$v) {
        if ($k == '') return PHP_INT_MAX;
        if (strlen($k) < strlen($v)) return $k;
        return $v;
}
?>

似乎您应该使用

  // Convert array to an array of string lengths
$lengths = array_map('strlen', $data);

  // Show min and max string length
echo "The shortest is " . min($lengths) .
     ". The longest is " . max($lengths);

请注意,
$length
数组是未排序的,因此您可以轻松检索每个字符串长度的对应数字。

为了完成此操作,这里有一个用于最大和最小值的一行代码:

$maximum = max(array_map('strlen', $array));
$minimum = min(array_map('strlen', $array));

它完全符合op的要求。但这是正确的。
$min
必须从一个非常高的数字开始(可能是int32.maxvalue?),或者您可以将$max/$min设置为第一个元素,并(可选)在迭代中跳过它。(使用
for
循环更容易做到这一点。)@konforce:使用这种方法,您必须确保您访问的是有效的条目(想想包含0或1个元素的数组),并将引入更多检查。无论哪种方法,您都必须检查空数组。使用Brian的代码,您可以在空数组上获得
$min=100,$max=-1
。因此,假设您现在有一个非空数组,
对于($i=1;$i<$len;+$i)
,都没有附加条件。事实上,您在第一次迭代中避免了if/else(因为它被跳过了).Plus,
foreach
往往是PHP中执行迭代最差的方式。但这些都是小点,我离题了……您是只想要字符串长度还是也想要字符串?您应该使用字符串而不是这些数字来消除长度/值混淆。+1整洁。您可以只做
数组映射('strlen',$data)
不过,这是目前为止最干净的解决方案,但效率不是很高,因为它会遍历数组三次(数组映射、最小值和最大值),所以如果您有大型数组,最好使用单个循环。@Vinko-是的,我想这就是NullUserException的答案获得优势的地方(在大数组的情况下…或在许多数组上多次使用此函数)。小心
strlen
-这是以字节为单位的字符串长度,而不是字符数。在特殊(多字节)字符的情况下,字符数更大,因此必须使用
mb_strlen
。这似乎太复杂了(添加了一个初始化的
$min
$max
),除非您处理的是一个只想遍历一次的巨大数组。是的,每次迭代三次函数调用?我不会。使用strlen映射同一数组两次以产生相同的结果是执行已接受答案的无意义的方式(9年前发布)。此帖子没有新的价值。
<?php
   $max_l = strlen(array_reduce($data,
                function ($k,$v) { return (strlen($k) > strlen($v)) ? $k : $v; }
        ));

   $min_l = strlen(array_reduce($data,
                function ($k,$v) {
                        if (!$k) return PHP_INT_MAX;
                        return (strlen($k) < strlen($v)) ? $k : $v;
                }
        ));

echo "The longest word is $max_l characters, while the shortest is $min_l\n";
?>
<?php
$array = array(
    "163",
    "630",
    "43",
    "924",
    "4",
    "54"
);
$arraycopy  = array_map('strlen',$array);
asort($arraycopy);

$min = reset($arraycopy);

//if you need a single 'minword'
$minword = $array[key($arraycopy)];
//if you need them all
$minwords = array_intersect_key($array,array_flip(array_keys($arraycopy,$min)));


$max = end($arraycopy);
//if you need a single 'maxword'
$maxword = $array[key($arraycopy)];
//if you need them all:
$maxwords = array_intersect_key($array,array_flip(array_keys($arraycopy,$max)));

var_dump($min,$max,$minword,$maxword,$minwords,$maxwords);
  // Convert array to an array of string lengths
$lengths = array_map('strlen', $data);

  // Show min and max string length
echo "The shortest is " . min($lengths) .
     ". The longest is " . max($lengths);
$maximum = max(array_map('strlen', $array));
$minimum = min(array_map('strlen', $array));