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
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
NullUserException
Hier ist eine verbesserte Version des Codes von brian_d:
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
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";
?>
<?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);
Typewar
Zur Vervollständigung hier ein Einzeiler für Maximum und Minimum:
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