数组如下所示:
array(
array(5, true, 'Foo'),
array(8, true, 'Bar'),
array(8, true, 'FooBar'),
)
我可以确定第三列的最长字符串长度,而不必遍历数组吗?
在我的示例中,最长的字符串是“FooBar” - 6 个字符。
如果内部数组只有字符串元素,我可以这样做max(array_map('strlen', $arr))
,但它有 3 个项目......
添加array_map('array_pop', $arr)
到混合物中:
<?php
$arr = array(
array(5, true, 'Foo'),
array(8, true, 'Bar'),
array(8, true, 'FooBarss')
);
print_r(max(array_map('strlen', array_map('array_pop', $arr))));
?>
给出8
(在我添加了两个ss
来检查之后)。array_pop()
取出最后一个数组元素并返回它,用于array_shift()
获取第一个。
首先,我很确定 max 函数会遍历整个数组。但是,如果您可以使用它,那么您可以定义自己的比较函数并传递它。
function cmp($a, $b) {
if (strlen($a[2]) == strlen($b[2])))
return 0;
return (strlen($a[2]) < strlen($b[2])) ? -1 : 1;
}
max(array_map('cmp', $arr))
简单地对数组数组进行排序然后选择第一个定位的行涉及额外/不必要的算法排序(特别是对于非最长行),并且如果最长的平局也可能会产生误导性结果。
我建议考虑多个最长字符串的可能性,并且只遍历输入数组一次。
代码:(演示)
$array = [
[5, true, 'FooBar'],
[8, true, 'Bar'],
[18, true, 'IsTied'],
];
$result = [];
$longest = 0;
foreach ($array as $row) {
$len = strlen($row[2]);
if ($len >= $longest) {
$longest = $len;
$result[$len][] = $row;
}
}
var_export($result[$longest] ?? []);
输出:
array (
0 =>
array (
0 => 5,
1 => true,
2 => 'FooBar',
),
1 =>
array (
0 => 18,
1 => true,
2 => 'IsTied',
),
)
也就是说,如果您只想查看最长的长度而不关心它来自哪里,那么您可以使用它:
var_export(max(array_map('strlen', array_column($array, 2))));