| 

.NET C# Java Javascript Exception

3
Wie kann ich mit Php aus folgendem Array die größte und kleinste Zahl auslesen?
$array['eins'] = 2;
$array['zwei'] = 5;
$array['drei'] = 7;
$array['vier'] = 1;
Der Key interessiert mich dazu auch!
12.10.2009
GuteFrage 103 1 3
8 Antworten
4
Noch einfacher:
asort($array); // sortieren
array_splice($array, 1, -1); // alles weg bis auf das erste und letzte Element

Nun kannst Du mit ner foreach die noch verbleibenden Elemente durchgehen.
12.10.2009
DaSpors 4,2k 2 8
1
Und woher weißt du dann welcher Key der höchste und welcher der kleinste ist ;-)?
Martin Bassus 12.10.2009
1
Da das Array vorher sortiert wurde (asort), ist der Erste der "kleinste" und der Zweite der "größte" Schlüssel. Um die Schlüssel gezielt anzusprechen könnte man array_keys() verwenden.
Allerdings funktioniert das Ganze nur mit alphanumerischen Schlüsseln, da array_splice() numerische Schlüssel nicht erhält. Aber im gegeben Bsp. geht es ja um alphanumerische Schlüssel.
FalkP 12.10.2009
1
asort($array):
Array ( [vier] => 1 [eins] => 2 [zwei] => 5 [drei] => 7 )
array_splice($array, 1, -1):
Array ( [vier] => 1 [drei] => 7 )
lunatigs 12.10.2009
Die Frage ist nun, was passiert mit gleichgroßen Werten (also zwei größten oder x kleinsten Werten) ?
Da sollte "GuteFrage" mal ne Marschrichtung vorgeben.
MiW 20.10.2009
2
Relativ simpel zu beantworten: im Normalfall benutzt du hier min() und max(), um die jeweiligen Zahlen aus deinem Array zu holen.

$kleinstezahl = min($array);
$groesstezahl = max($array);
12.10.2009
Dustin Klein 2,9k 2 9
2
Aber den Key bekommt er dann nicht oder?
Void 12.10.2009
2
Ne, das gibt nur 1 und 7 aus, aber nicht den Key.
lunatigs 12.10.2009
1
Das stimmt natürlich, den Key bekommt man so nicht.
Dustin Klein 12.10.2009
2
Ich halte das für die übersichtlichste Lösung

$key_max = false;
$key_min = false;

foreach ($array as $key=>$val){
$key_max = $key_max===false || $array[$key_max]<$val ? $key : $key_max;
$key_min = $key_min===false || $array[$key_min]>$val ? $key : $key_min;
}

//$array[$key_min] => minimum
//$array[$key_max] => maximum
12.10.2009
huckepick 887 2 8
1
Wie du siehst handelt es sich hier nicht um Profis.. und die schreibweise mit ? und : ist wohl eher was für "Fortgeschrittene" ;-)
Martin Bassus 12.10.2009
1
Trotzdem gute Antwort.
lunatigs 12.10.2009
2
Ob es im Endeffekt performanter ist kann ich nicht sagen, aber zumindest OHNE Schleife:
$maxVar = max($array);
$minVar = min($array);
$flipArray = array_flip($array);

echo $flipArray[$maxVar].': '.$maxVar.'<br />';
echo $flipArray[$minVar].': '.$minVar.'<br />';
12.10.2009
FalkP 3,3k 3 8
1
einfach und genial ;)
Dustin Klein 12.10.2009
Das funktioniert aber nur, wenn alle Werte eineindeutig sind, d.h. es keine Duplikate in den Werten und Schlüsseln gibt.
tomahlak 23.10.2009
2
Eine weitere "Einzeiler-Lösung" wäre folgende, ist aber defitiv unperformanter (bis zu ~70%) als beispielsweise die Schleifen-Lösung von huckepick.

PHP-Code
$min = $array[array_search(min($array), $array)];
$max = $array[array_search(max($array), $array)];


In $min und $max ist letztlich direkt der Key und die Value zu finden.
13.10.2009
Blauesocke 637 2 8
1
Kein Spaß mehr am programmieren die Leute ...

Einfach das Array durchlaufen, zwei Temp-Variablen mitlaufen lassen, die die aktuell größte bzw. kleinste Zahl speichern und jeweils den Key dazu. Gibts ne größere bzw. kleinere Zahl werden die Temp-Variablen entsprechend aktualisiert und am Ende haste dann die größte und kleinste Zahl mit Key dazu. Kann man in einer Schleife abfackeln oder auch in zwei oder zwei Funktionen drauß machen ... ist kaum Aufwand.

Wär allerdings dufte und performanter, wenns bereits ne PHP-Funktion gäb, die das macht.
Weiß ich aber nicht ob es die gibt.
12.10.2009
lunatigs 1,3k 2 8
2
Schleifen werden nur ein bisschen aufwendig (i.e. inperformant) bei sehr großen arrays und/oder mehrfacherm Aufruf mit verschiedenen Arrays.
MiW 20.10.2009
1
Ist das irgendwo bewiesen? Nach meinen kurzen Tests (mit kleinen Arrays) war eine eigene Schleifen-Lösung performanter als eine Umsetzung ohne Schleifen.
Blauesocke 21.10.2009
1
In etwa so (ungetestet):

<?php
$array['eins'] = 2;
$array['zwei'] = 5;
$array['drei'] = 7;
$array['vier'] = 1;
$temp_key_up=""; // Key der höchsten Zahl
$temp_zahl_up=""; // Höchste Zahl
$temp_key_down=""; // Key der kleinsten Zahl
$temp_zahl_down=""; // Kleinste Zahl
foreach($array as $key => $val)
{
if($val > $temp_zahl_up or $temp_zahl_up =="")
{
$temp_key_up=$key;
$temp_zahl_up=$val;
}
if($val <$temp_zahl_down or $temp_zahl_down =="")
{
$temp_key_down=$key;
$temp_zahl_down=$val;
}
}
echo "Höchste Zahl (Zahl/Key): ".$temp_zahl_up."/".$temp_key_up."<br>";
echo "Kleinste Zahl (Zahl/Key): ".$temp_zahl_down."/".$temp_key_down."<br>";
?>
12.10.2009
Martin Bassus 486 1 1 8
1
foreach kopiert das Array vor der Iteration. Das kann ungünstig sein, wenn das Array sehr groß ist.

Die Abfrage mit OR ist aus irgendwie sinnlos.
Initialisiere den Tempwert mit 0 nicht mit einem leeren String, dann brauchste auch OR nicht mehr
tomahlak 23.10.2009
1
Ups, nicht 0 sondern reset($array); zuerst und dann current($array) als Wert. Mein Fehler.
tomahlak 23.10.2009
-1
Vermutlich wäre eine Callback-Funktion, die auf alle Elemente angewendet wird hilfreich.

$array['eins'] = 2;
$array['zwei'] = 5;
$array['drei'] = 7;
$array['vier'] = 1;

reset($array);

$result = array(
"min" => array(current($array),key($array)),
"max" => array(current($array),key($array)),
);

function insertItem(&$result, &$item, &$key)
{
$result[0] = $item;
$result[1] = $key;
}

function findMinMax(&$item, $key, &$result)
{
if ($item < $result['min'][0]) {
insertItem($result['min'], $item, $key);
} elseif ($item > $result['max'][0] {
insertItem($result['max'], $item, $key);
}
}

array_walk($array, 'findMinMax', $result);
23.10.2009
tomahlak 237 1 2
1
Die Frage, was bei zwei gleichen Werten aus $array passiert, ist aber offen.
tomahlak 23.10.2009

Stelle deine Php-Frage jetzt!