给出一个数组,我想按长度获取最长的字符串,而不使用foreach循环。
下面是我的数组
$array = array(
'Google',
'Facebook',
'Twitter',
'Slack',
'Twilio',
);
此问题返回最大长度,但我想获取字符串的值。 PHP shortest/longest string in array
答案 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
)
答案 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_filter
,array_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_search
与max
一起使用来获取长度最大的元素
$r = null;
array_walk($array, function($v) use (&$r){
$r[$v] = strlen($v);
});
echo array_search(max($r), $r);