4

配列は次のようになります。

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

配列を反復処理せずに、3番目の列の最長の文字列の長さを決定できますか?

私の例では、最長の文字列は「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ために2つを追加した後)。配列の最後の要素を取り出して返します。最初の要素を取得するために使用します。ssarray_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

単純に配列の配列を並べ替えてから最初に配置された行を選択すると、余分な/不必要なアルゴリズムによる並べ替え (特に最長でない行の場合) が発生し、最長が同点の場合は誤解を招く結果が生じる可能性があります。

複数の最長文字列の可能性に対応し、入力配列を 1 回だけトラバースすることをお勧めします。

コード: (デモ)

$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 に答える