PHP获取数组中最长的字符串而无循环

时间:2019-07-13 08:49:56

标签: php arrays

给出一个数组,我想按长度获取最长的字符串,而不使用foreach循环。

下面是我的数组

$array = array(
    'Google',
    'Facebook',
    'Twitter',
    'Slack',
    'Twilio',
);

此问题返回最大长度,但我想获取字符串的值。 PHP shortest/longest string in array

4 个答案:

答案 0 :(得分:3)

您可以使用例如usort按长度对字符串进行排序,并使用reset获得第一项。

$array = array(
    'Google',
    'Facebook',
    'Twitter',
    'Slack',
    'Twilio',
);

usort($array, function ($a, $b) {
    return strlen($a) < strlen($b);
});

echo reset($array); // Facebook

如果有更多相同长度的字符串,则可以使用foreach并在长度不等于项目的当前长度时退出循环,以防止循环整个列表。

$item = reset($array);
$result = [];

if ($item) {
    $len = strlen($item);
    foreach($array as $value) {
        if (strlen($value) === $len) {
            $result[] = $value;
            continue;
        }
        break;
    }
}

print_r($result);

结果

Array
(
    [0] => Facebook
    [1] => Test1112
)

Php demo

答案 1 :(得分:3)

我发现“ no foreach循环”的限制非常疯狂。毕竟,您需要迭代数组以执行此过程。您选择的任何语法都需要在后台“循环”。

由于这个原因,我放弃了您的限制,以便向您展示一种干净有效的方法,该方法不会进行过多的函数调用,并且不会出现多个“最长”值的可能性。

代码:(Demo

$array = array(
    'Google',
    'Facebook',
    'Twitter',
    'Slack',
    'Twilio',
    'Bookface'
);
$cachedLength = 0;
$longest = [];

foreach ($array as $value) {
    $currentLength = strlen($value);
    if ($currentLength > $cachedLength) {
        $longest = [$value];
        $cachedLength = $currentLength;
    } elseif ($currentLength == $cachedLength) {
        $longest[] = $value;
    }
}
var_export($longest);

输出:

array (
  0 => 'Facebook',
  1 => 'Bookface',
)

为澄清起见,$longest = [$value];声明(或覆盖了先前声明的)$ longest数组。这样,您将永远不会看到任何较小的值被压入数组。

如果后续值的长度与$longest中存储的值相同,则$longest[] = $value;将其推入输出数组。

此代码段每个元素只会调用strlen()一次。没有其他函数调用可产生所需的输出。如果要进入专业项目,我将使用这种方法。

答案 2 :(得分:2)

  

给定一个数组,我想按长度获取最长的字符串而没有   使用foreach循环。

如果不使用foreach循环(或任何循环),则无法获取数据。 array_filterarray_map等包装器确实在幕后循环。从您链接的answer扩展,您可以只使用array_filter来过滤出最长的字符串。

<?php 

$data =  array(
    'Google',
    'Facebook',
    'Twitter',
    'Slack',
    'Twilio',
);

$lengths = array_map('strlen', $data);

$max_len = max($lengths);

$longest_strings = array_filter($data,function($value) use ($max_len){
    return strlen($value) === $max_len;
});

print_r($longest_strings);

答案 3 :(得分:0)

您可以使用array_walk来获取每个数组元素的长度,而不是将array_searchmax一起使用来获取长度最大的元素

$r = null;
array_walk($array, function($v) use (&$r){
  $r[$v] = strlen($v);
});
echo array_search(max($r), $r);

实时示例:https://3v4l.org/ETf9F