39

私はこのような配列を持っています

$data = array(
    "163",
    "630",
    "43",
    "924",
    "4",
    "54"
);

数値ではなく文字列の長さに応じて、最小値と最大値を選択するにはどうすればよいですか。 (この例では、 1 (最小) と 3 (最大)です。

4

6 に答える 6

63

array_map()を使用する必要があるようです

  // Convert array to an array of string lengths
$lengths = array_map('strlen', $data);

  // Show min and max string length
echo "The shortest is " . min($lengths) .
     ". The longest is " . max($lengths);

$lengths配列はソートされていないため、各文字列の長さに対応する数値を簡単に取得できます。

于 2010-09-14T23:42:15.303 に答える
5

これはbrian_d のコードの改良版です:

$min = PHP_INT_MAX;
$max = -1;

foreach ($data as $a) {
    $length = strlen($a);
    $max = max($max, $length);
    $min = min($min, $length);
}
于 2010-09-14T23:10:11.870 に答える
4

この場合、配列を 2 回走査することになるためお勧めできませんが、array_reduceを使用して各要素を残りの要素と比較することもできます。このような:

<?php

$data = array('163','630','43','42','999','31');
//Will return the longest element that is nearest to the end of the array (999)
//That's why we use strlen() on the result.
$max_l = strlen(array_reduce($data,'maxlen'));
//Will return the shortest element that is nearest to the end of the array (31)
$min_l = strlen(array_reduce($data,'minlen'));

echo "The longest word is $max_l characters, while the shortest is $min_l\n";

function maxlen($k,$v) {
        if (strlen($k) > strlen($v)) return $k;
        return $v;
}
function minlen($k,$v) {
        if ($k == '') return PHP_INT_MAX;
        if (strlen($k) < strlen($v)) return $k;
        return $v;
}
?>

PHP 5.3.0 以降を使用している場合は、クロージャーを利用できます。

<?php
   $max_l = strlen(array_reduce($data,
                function ($k,$v) { return (strlen($k) > strlen($v)) ? $k : $v; }
        ));

   $min_l = strlen(array_reduce($data,
                function ($k,$v) {
                        if (!$k) return PHP_INT_MAX;
                        return (strlen($k) < strlen($v)) ? $k : $v;
                }
        ));

echo "The longest word is $max_l characters, while the shortest is $min_l\n";
?>
于 2010-09-14T23:13:13.480 に答える
2
$min = 100;
$max = -1;

foreach($data as $a){
  $length = strlen($a);
  if($length > $max){ $max = $length; }
  else if($length < $min){ $min = $length; }
}
于 2010-09-14T23:01:28.600 に答える
1
<?php
$array = array(
    "163",
    "630",
    "43",
    "924",
    "4",
    "54"
);
$arraycopy  = array_map('strlen',$array);
asort($arraycopy);

$min = reset($arraycopy);

//if you need a single 'minword'
$minword = $array[key($arraycopy)];
//if you need them all
$minwords = array_intersect_key($array,array_flip(array_keys($arraycopy,$min)));


$max = end($arraycopy);
//if you need a single 'maxword'
$maxword = $array[key($arraycopy)];
//if you need them all:
$maxwords = array_intersect_key($array,array_flip(array_keys($arraycopy,$max)));

var_dump($min,$max,$minword,$maxword,$minwords,$maxwords);
于 2010-09-14T23:29:08.487 に答える
-1

完了するために、最大値と最小値のワンライナーを次に示します。

$maximum = max(array_map('strlen', $array));
$minimum = min(array_map('strlen', $array));
于 2019-08-27T02:27:53.210 に答える