开发者

Read the longest string from an array in PHP 5.3

开发者 https://www.devze.com 2023-03-19 08:47 出处:网络
Here is part of the code. $DatabaseArray=Array("Cooking","look","I cant","Walking the dog to the park","washing","talk","one");

Here is part of the code.

$DatabaseArray=Array("Cooking","look","I cant","Walking the dog to the park","washing","talk","one");
  
$largest = max($DatabaseArray);
  
echo $largest. "<br />";

I would like to read the longest string from an array in PHP 5.3.开发者_StackOverflow社区0. I've tried the max function but doesnt seem to work as expected.


$longestEntry = array_reduce($databaseArray, function ($a, $b) { return strlen($a) > strlen($b) ? $a : $b; });

(uses PHP 5.3 syntax)

You can't just use max, since that assumes all entries are numbers. Since they're strings though, "the maximum string" could mean anything, so you have to do manual comparison using strlen. The above array_reduce method with custom reduce function does such comparison and reduces the array to the longest member.

If you have a lot of entries (and I mean a lot, hundreds or thousands and up), it may not be very efficient, since it basically applies strlen twice to the whole array. If that's a problem, this is more efficient by applying strlen only once per string:

$longestEntry = current(array_reduce($databaseArray, function ($a, $b) {
    $b = array($b, strlen($b));
    return $a[1] > $b[1] ? $a : $b;
}, array(null, 0)));

Since you're calling it a DatabaseArray though: If this is coming from the database, you should make it do the work. It's probably going to be even more efficient. E.g.:

SELECT * FROM `table` ORDER BY CHAR_LENGTH(`string_col`) DESC LIMIT 1


$lengths = array_map('strlen', $DatabaseArray);
$maxLength = max($lengths);
$index = array_search($maxLength, $lengths);
echo $DatabaseArray[$index];


Like @deceze's answer, my suggestion is a single pass over the input array. @KingCrunch's has a greater cost in terms of time complexity because it is using functions to traverse the data more N times.

Below has the same fundamental logic as @deceze's PHP snippet, but uses intuitive, individual variables instead of indexed elements for temporary storage.

Code: (Demo)

$maxLength = -1;
$longestValue = null;
foreach ($array as $value) {
    $length = strlen($value);
    if ($length > $maxLength) {
        $maxLength = $length;
        $longestValue = $value;
    }
}
var_export($longestValue);

Output:

'Walking the dog to the park'
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号