Kürzeste/längste PHP-Stringlänge im Array [duplicate]

Lesezeit: 4 Minuten

Benutzer-Avatar
Markus Lalor

ich habe ein Reihe so was

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

Wie kann ich die auswählen kleinste und größte Werte davon nach Saitenlänge NICHT Zahlenwert. (in diesem Beispiel ist es 1 (kleinste) und 3 (größte).

  • Möchten Sie nur die Saitenlänge oder möchten Sie auch die Saiten?

    – NullUserException

    14. September 2010 um 23:04 Uhr

  • Sie sollten die Verwirrung zwischen Länge und Wert beseitigt haben, indem Sie Zeichenfolgen anstelle dieser Zahlen verwenden.

    – Muhammad bin Yusrat

    15. Dezember 2017 um 18:29 Uhr

Benutzer-Avatar
Peter Aytai

Scheint, als sollten Sie eine verwenden 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);

Notiere dass der $lengths Das Array ist unsortiert, sodass Sie die entsprechende Nummer für jede Zeichenfolgenlänge leicht abrufen können.

  • +1 Ordentlich. Du könntest es einfach tun array_map('strlen', $data) obwohl;

    – NullUserException

    14. September 2010 um 23:51 Uhr

  • Dies ist bei weitem die sauberste Lösung, aber nicht sehr effizient, da das Array dreimal durchlaufen wird (array_map, min und max). Wenn Sie also große Arrays haben, verwenden Sie besser eine einzelne Schleife.

    – Vinko Vrsalović

    15. September 2010 um 1:03 Uhr

  • @Vinko – Ja, ich denke, hier würde die Antwort von NullUserException den Vorteil erlangen (im Fall eines riesigen Arrays … oder wenn diese Funktion sehr, sehr oft für viele, viele Arrays verwendet wird).

    – Peter Ajtai

    15. September 2010 um 1:32 Uhr

  • Sei vorsichtig bei strlen – Es ist die Zeichenfolgenlänge in Bytes, nicht die Anzahl der Zeichen. Die Anzahl der Zeichen ist daher bei Sonderzeichen (Multibyte) größer mb_strlen muss benutzt werden.

    – Mikep

    19. November 2020 um 8:39 Uhr

Benutzer-Avatar
NullUserException

Hier ist eine verbesserte Version des Codes von brian_d:

$min = PHP_INT_MAX;
$max = -1;

foreach ($data as $a) {
    $length = strlen($a);
    $max = max($max, $length);
    $min = min($min, $length);
}

  • Dies scheint übermäßig komplex zu sein (mit dem Hinzufügen einer initialisierten $min und $max), es sei denn, Sie haben es mit einem riesigen Array zu tun, das Sie nur einmal durchlaufen möchten.

    – Peter Ajtai

    15. September 2010 um 1:31 Uhr


  • Ja, drei Funktionsaufrufe bei jeder Iteration? Ich würde nicht.

    – mickmackusa

    8. März 2020 um 12:06 Uhr

Benutzer-Avatar
Vinko Vrsalović

Obwohl es in diesem Fall nicht ratsam ist, da Sie das Array zweimal durchlaufen werden, können Sie auch verwenden array_reduce um jedes Element mit den anderen zu vergleichen. So was:

<?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;
}
?>

Wenn Sie PHP 5.3.0+ verwenden, können Sie davon profitieren Schließungen:

<?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";
?>

$min = 100;
$max = -1;

foreach($data as $a){
  $length = strlen($a);
  if($length > $max){ $max = $length; }
  else if($length < $min){ $min = $length; }
}

Benutzer-Avatar
Wrikken

<?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);

Benutzer-Avatar
Typewar

Zur Vervollständigung hier ein Einzeiler für Maximum und Minimum:

$maximum = max(array_map('strlen', $array));
$minimum = min(array_map('strlen', $array));

1246860cookie-checkKürzeste/längste PHP-Stringlänge im Array [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy