4

数组如下所示:

array(
  array(5, true, 'Foo'),
  array(8, true, 'Bar'),
  array(8, true, 'FooBar'),
)

我可以确定第三列的最长字符串长度,而不必遍历数组吗?

在我的示例中,最长的字符串是“FooBar” - 6 个字符。

如果内部数组只有字符串元素,我可以这样做max(array_map('strlen', $arr)),但它有 3 个项目......

4

3 回答 3

2

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

?>

http://codepad.org/tRzHoy7Z

给出8(在我添加了两个ss来检查之后)。array_pop()取出最后一个数组元素并返回它,用于array_shift()获取第一个。

于 2012-07-26T23:13:11.557 回答
2

首先,我很确定 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))
于 2012-07-26T23:16:24.543 回答
0

简单地对数组数组进行排序然后选择第一个定位的行涉及额外/不必要的算法排序(特别是对于非最长行),并且如果最长的平局也可能会产生误导性结果。

我建议考虑多个最长字符串的可能性,并且只遍历输入数组一次。

代码:(演示

$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))));
于 2021-09-14T23:57:24.307 回答