可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have an array like this
$data = array( "163", "630", "43", "924", "4", "54" );
How can I select the smallest and largest values from it according to string length NOT number value. (for this example it is 1 (smallest) and 3 (largest).
回答1:
Seems like you should use an 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);
Note that the $lengths
array is unsorted, so you can easily retrieve the corresponding number for each string length.
回答2:
Here's an improved version of brian_d's code:
$min = PHP_INT_MAX; $max = -1; foreach ($data as $a) { $length = strlen($a); $max = max($max, $length); $min = min($min, $length); }
回答3:
Although in this case it is not advisable because you'll be traversing the array twice, you can also use array_reduce to compare each element against the rest. Like this:
<?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; } ?>
If you are using PHP 5.3.0+ you can take advantage of closures:
<?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"; ?>
回答4:
$min = 100; $max = -1; foreach($data as $a){ $length = strlen($a); if($length > $max){ $max = $length; } else if($length < $min){ $min = $length; } }
回答5:
<?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);