Zwei Array,s zu einem
Fiffi
- php
Hallo und guten morgen,
leider komme ich bei folgendem nicht weiter....
Mein Eingangs-Array:
$wertungen = array(
array ('ralf',6),
array ('ziggi',4),
array ('bobby',6),
array ('hexe',4),
array ('willi',3),
array ('Mika57',5),
array ('bobby',5),
);
Damit bekomme ich wie gewünscht raus:
$new_array = array( );
foreach( $wertungen as $row )
{
/* Name als Key und Summe der Punkte vom Namen als Wert ins leere Array */
$new_array[ $row[0] ] += $row[1];
}
[Name] => GESAMT-PUNKTE
Array
(
[ralf] => 6
[ziggi] => 4
[bobby] => 11
[hexe] => 4
[willi] => 3
[Mika57] => 5
)
Nun ermittele ich wie oft ein Name vorkommt (ANZAHL) im Eingangs-Array mit:
$vorkommen =array();
foreach($wertungen as $anz_name)
{
$vorkommen[ $anz_name[0] ] += 1;
}
Array
(
[ralf] => 1
[ziggi] => 1
[bobby] => 2
[hexe] => 1
[willi] => 1
[Mika57] => 1
)
Aber ich wie bekomme ich hinter [NAME] und GESAMT-PUNKTE nun noch die ANZAHL ?
Mit foreach klappte das nicht bei mir. array_merge bzw array_combine klappte auch nicht.
Gruss Fiffi
Hello,
Aber ich wie bekomme ich hinter [NAME] und GESAMT-PUNKTE nun noch die ANZAHL ?
Wie sieht denn Deine Ziel-Datenstruktur aus?
$_info = array();
$_info[$name] = array();
$_info[$name][$amount] = 0;
$_info[$name][$count] = 0;
$_info[$name][$text] = '';
usw.
Berücksichtige das in deiner foreach-Schleife für die Zusammenführung.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hallo,
Wie sieht denn Deine Ziel-Datenstruktur aus?
Hehe, ich glaube genau das ist seine Frage ;)
Jeena
Hello Jeena,
Wie sieht denn Deine Ziel-Datenstruktur aus?
Hehe, ich glaube genau das ist seine Frage ;)
Ob ihm das so bewusst war?
Und ein Beispiel dafür hat von mir auch bekommen...
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Naja,
ich muss ja offen eingestehen das, mir leider noch nicht soviel bewusst ist, was array,s angeht.
Aber ich habe dank Jeena ein Ziel bekommen das mir bei der Ausgabe hilft.
Gut. ein Problem hab ich noch:
Und das ist das korrekte sortieren nach:
Zuerst: Gesamt Punkte und wenn da Gleichstand ist, nach:
Spiele [ANZAHL]
Ob ihm das so bewusst war?
Ich glaube nicht wirklich.
Aber wie das so ist in PHP (bei mir): Ein Problem gelöst und 20 Neue tauchen wieder auf *gg
Hallo,
array,s
seit wann wird das Plural-s durch ein Komma abgetrennt (auch im Thread-Titel)? Den Unfug mit dem Apostroph kenne ich ja schon, aber das ist ja mal eine ganz neue Masche.
Aber wie das so ist in PHP (bei mir): Ein Problem gelöst und 20 Neue tauchen wieder auf *gg
Das ist bei anderen Themen auch oft so.
Merke: In jedem kleinen Problem steckt ein großes, das nur zu gern raus will. (aus Murphy's Law)
Ciao,
Martin
Hallo Martin,
array,s
seit wann wird das Plural-s durch ein Komma abgetrennt (auch im Thread-Titel)? Den Unfug mit dem Apostroph kenne ich ja schon, aber das ist ja mal eine ganz neue Masche.
Meine Rechtschreibfehler kannst du gerne behalten. In der Hinsicht bin ich ein Gönner :-)
Konstruktive Hilfe ist besser als zu versuchen Andere vorzuführen mit unsachlichen Äusserungen.
Hello,
Gut. ein Problem hab ich noch:
Und das ist das korrekte sortieren nach:
Zuerst: Gesamt Punkte und wenn da Gleichstand ist, nach:
Spiele [ANZAHL]
Wie entscheidest Du denn im wirklichen Leben, in welche Reihenfolge Du etwas bringst?
Du stellst eine Vergleichsregel auf, die Du auf Element + Nachfolger oder Element und Vorgänger anwendest.
Das Anwenden auf die Elemente eines Arrays nimmt die die PHP-Funktion http://www.php.net/manual/en/function.usort.php ab. Die Vergleichsfunktion musst Du selber erstellen.
Zeig uns doch mal drei typische Elemente, die Du sortiert haben willst
ein wenig vereinfacht dargestellt:
array
(
[1][punkte] => 10
[1][anzahl] => 3
[2][punkte] => 2
[2][anzahl] => 1
[3][punkte] => 10
[3][anzahl] => 2
)
Nun bracuhst Du nur eine Vergleichsfunktion dafür festzulegen, die als Ergebniss hat für
A > B -> 1,
A < B -> -1,
A == B -> 0,
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hallöchen lieber Tom,
Dein Vorschlag hat mich etwas verwirrt:
Nun brauchst Du nur eine Vergleichsfunktion dafür festzulegen, die als Ergebniss hat für
A > B -> 1,
A < B -> -1,
A == B -> 0,
Ich bitte um Verständnis, wenn ich nicht so gut in Mathe oder Logik bin.
Verstanden habe ich das so:
wenn: A > B dann 1,
sonst: A < B dann -1,
sonst: A == B dann 0,
Aber wie mache ich da eine Funktion raus ? usort aus dem Manual hatte ich auch schon in anderen scripten von mir angewendet. Aber da hatte ich nur Zwei Bedingungen.
Bissl confused bin gerade
Gruss Fiffi
Hello Fiffi,
Dein Vorschlag hat mich etwas verwirrt:
War zu erwarten. Ich kenne keinen, der nicht verwirrt war von der "Callback-Funktion", als er sie das allererste Mal vorgesetzt bekommen hat.
Nun brauchst Du nur eine Vergleichsfunktion dafür festzulegen, die als Ergebniss hat für
A > B -> 1,
A < B -> -1,
A == B -> 0,Ich bitte um Verständnis, wenn ich nicht so gut in Mathe oder Logik bin.
Verstanden habe ich das so:
wenn: A > B dann 1,
sonst: A < B dann -1,
sonst: A == B dann 0,
Genau so ist es gemeint. So steht es nämlich im Manual.
Aber wie mache ich da eine Funktion draus ? usort aus dem Manual hatte ich auch schon in anderen scripten von mir angewendet. Aber da hatte ich nur Zwei Bedingungen.
function result_cmp($_a, $_b)
{
if ($_a['punkte'] > $_b['punkte']) return 1; ## A ist > als B
if ($_a['punkte'] == $_b['punkte'])
{
if ($_a['anzahl'] > $_b['anzahl']) return 1; ## A ist > als B
if ($_a['anzahl'] == $_b['anzahl']) return 0; ## A ist == B
return -1; ## A ist < als B
}
return -1; ## Es bleibt bur, dass A < B sein muss
}
Das ist jetzt keine saubere Strukturierte Programmierung nach Nassi Shniderman,
http://de.wikipedia.org/wiki/Nassi-Shneiderman-Diagramm
denn da fehlen die expliziten ELSE-Zweige. Aber Du kannst sie hoffentlich sofort lesen und verstehen in dieser verkürzten Schreibweise.
Die Funktion lässt sich auch noch weiter zusammanfassen. Aber das kannst Du mal selber versuchen.
Nun kannst Du diese Funktion in usort() http://www.php.net/manual/en/function.usort.php benutzen und hoffen, dass sie funktioniert ;-)
Für die Produktivumgebung müsste man außerdem noch sicherstellen, dass das zu prüfende Array das passende Format hat. Das könnte man in diese Funktion verlagern, oder besser eine eigenständige Prüfung vornehmen, bevor der Vergleich gestartet wird.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Lieber Tom,
danke für deine Hilfestellung.
function result_cmp($_a, $_b)
{
if ($_a['punkte'] > $_b['punkte']) return 1; ## A ist > als Bif ($_a['punkte'] == $_b['punkte'])
{
if ($_a['anzahl'] > $_b['anzahl']) return 1; ## A ist > als B
if ($_a['anzahl'] == $_b['anzahl']) return 0; ## A ist == B
return -1; ## A ist < als B
}return -1; ## Es bleibt bur, dass A < B sein muss
}
Der Vorschlag klappt nicht, da mein Array diese Struktur hat:
Array
(
[ralf] => Array
(
[0] => 4
[1] => 11
)
[ziggi] => Array
(
[0] => 2
[1] => 13
)
[bobby] => Array
(
[0] => 4
[1] => 11
)
[willi] => Array
(
[0] => 1
[1] => 3
)
[Mika57] => Array
(
[0] => 1
[1] => 5
)
)
Das hab ich mir angesehen und bin noch verwirrter.
Das ist jetzt keine saubere Strukturierte Programmierung nach Nassi Shniderman,
http://de.wikipedia.org/wiki/Nassi-Shneiderman-Diagramm
Die Funktion lässt sich auch noch weiter zusammanfassen. Aber das kannst Du mal selber versuchen.Nun kannst Du diese Funktion in usort() http://www.php.net/manual/en/function.usort.php benutzen und hoffen, dass sie funktioniert ;-)
Jau, das hab ich versucht mit:
usort ($result,'result_cmp');
angewendet mit:
function result_cmp($_a, $_b)
{
if ($_a[1] > $_b[2]) return 1; ## A ist > als B
if ($_a[1] == $_b[2])
{
if ($_a[1] > $_b[2]) return 1; ## A ist > als B
if ($_a[1] == $_b[2]) return 0; ## A ist == B
return -1; ## A ist < als B
}
return -1; # Es bleibt nur, dass A < B sein muss
}
Nur ich bekomme dabei heraus:
Platz Name Punkte Turniere
gespielt
1 0 3 1
2 1 13 2
3 2 11 4
4 3 11 4
5 4 5 1
Tut mir leid wenn ich etwas daneben bin. Ich hab versucht deine Funktion auf mein Start-Array anzuwenden, bzw anzupassen.
Gruss Fiffi
Hello Fiffi,
danke für deine Hilfestellung.
function result_cmp($_a, $_b)
{
if ($_a['punkte'] > $_b['punkte']) return 1; ## A ist > als Bif ($_a['punkte'] == $_b['punkte'])
{
if ($_a['anzahl'] > $_b['anzahl']) return 1; ## A ist > als B
if ($_a['anzahl'] == $_b['anzahl']) return 0; ## A ist == B
return -1; ## A ist < als B
}return -1; ## Es bleibt bur, dass A < B sein muss
}Der Vorschlag klappt nicht, da mein Array diese Struktur hat:
Du musst doch jetzt nur die Namen gegen die Indexe austauschen, also
'punkte' gegen [1]
'anzahl' gegen [2]
nehme ich mal an. Du hast ja nicht dokumentiert. Da kann ich nur raten, was was ist.
Du hast ab Blödsinn gemacht. Schau es Dir nochmal genau an. Du vergleichst jetzt die Punkte mit der Anzahl.
Array
(
[ralf] => Array
(
[0] => 4
[1] => 11
)[ziggi] => Array
(
[0] => 2
[1] => 13
)[bobby] => Array
(
[0] => 4
[1] => 11
)[willi] => Array
(
[0] => 1
[1] => 3
)[Mika57] => Array
(
[0] => 1
[1] => 5
))
Also tausche bitte die Elementbezeicher in der Funktion _richtig_ aus, dann klappt es auch mit dem Vergleich.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
das sollte selbstverständlich [0] und [1] heißen...
'punkte' gegen [1]
'anzahl' gegen [0]
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hallo lieber Tom,
ich habe wirklich bockmist gemacht. Es ist natürlich besser "sprechende" Bezeichner in einem Array zu haben. Deshalb habe ich nun folgendes Ausgangs-Array:
Array
(
[ralf] => Array
(
[punkte] => 11
[gespielt] => 4
)
[ziggi] => Array
(
[punkte] => 13
[gespielt] => 2
)
[bobby] => Array
(
[punkte] => 11
[gespielt] => 3
)
[willi] => Array
(
[punkte] => 3
[gespielt] => 1
)
[Mika57] => Array
(
[punkte] => 5
[gespielt] => 1
)
)
Darauf habe ich mit:
usort($result,'result_cmp');
Diese Funktion angewendet:
function result_cmp($_a, $_b)
{
if ($_a['punkte'] < $_b['punkte']) return 1; ## A ist < als B
if ($_a['punkte'] == $_b['punkte'])
{
if ($_a['gespielt'] < $_b['gespielt']) return 1; ## A ist < als B
if ($_a['gespielt'] == $_b['gespielt']) return 0; ## A ist == B
return -1; ## A ist < als B
}
Das führt auch zu dem von mir gewünschten Sortier-Ergebnis.
Aber leider sind nun die Namen ausgetauscht mit numerischen Indizie,s
Array
(
[0] => Array
(
[punkte] => 13
[gespielt] => 2
)
[1] => Array
(
[punkte] => 11
[gespielt] => 4
)
[2] => Array
(
[punkte] => 11
[gespielt] => 3
)
[3] => Array
(
[punkte] => 5
[gespielt] => 1
)
[4] => Array
(
[punkte] => 3
[gespielt] => 1
)
)
Aber die Namen brauche ich natürlich :-)
Gruss Fiffi
Hat sich erledigt. Lesen bildet :-)
uasort($result,'result_cmp');
uasort() - Sortiert ein Array mittels einer benutzerdefinierten Vergleichsfunktion und behält Indexassoziationen bei.
Gruss Fiffi und danke für eure Hilfe
Hello Fiffi,
Hat sich erledigt. Lesen bildet :-)
uasort($result,'result_cmp');
uasort() - Sortiert ein Array mittels einer benutzerdefinierten Vergleichsfunktion und behält Indexassoziationen bei.
Na, das ist doch jetzt mal ein Erfolg. Da mag man dann gleich umso lieber wieder weiterbasteln ;-))
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Lieber Tom,
Na, das ist doch jetzt mal ein Erfolg. Da mag man dann gleich umso lieber wieder weiterbasteln ;-))
ja. Und das mit noch mehr Schwung :-)
Dir nochmals Lieben Dank für Deine Unterstützung
Hallöchen,
leider brauche ich in meinem Fall nochmals Hilfe, da ich das letzte Datum noch in meiner Tabelle brauche. Exemplarisch zu einem TimeStamp habe ich in meinem Fall nur kleine Zahlen aufgeführt.
Mein Ausgangs-Array (Name, Punkte, Datum):
$wertungen = array(
array ('Fiffi',2,400),
array ('Mamasschlumpf78',2,400),
array ('Snoopyy',4,400),
array ('DJmünstermaus',8,400),
array ('Meeresreuber481',6,400),
array ('blauerengel457',5,50),
array ('Fiffi',8,101),
array ('blauerengel457',5,100),
)
Nun habe ich so versucht das letzte "Datum" zum Namen zu bekommen:
$datum =array();
foreach($wertungen as $last_date)
{
$datum[ $last_date[0] ] = max($last_date);
// $datum[ $last_date[0] ] = max($last_date[2]); schlägt fehl
}
Leider stimmt das gar nicht, Weil Fiffi die 400 haben müsste:
Array
(
[Fiffi] => 101
[Mamasschlumpf78] => 400
[Snoopyy] => 400
[DJmünstermaus] => 400
[Meeresreuber481] => 400
[blauerengel457] => 100
)
Liebe Grüsse Fiffi
Hi,
leider brauche ich in meinem Fall nochmals Hilfe, da ich das letzte Datum noch in meiner Tabelle brauche.
Nun habe ich so versucht das letzte "Datum" zum Namen zu bekommen:
Was denn jetzt, das „letzte“, innerhalb der gegebenen Reihenfolge der Daten, oder das Maximum?
$datum =array();
foreach($wertungen as $last_date)
{
$datum[ $last_date[0] ] = max($last_date);
// $datum[ $last_date[0] ] = max($last_date[2]); schlägt fehl
}
>
> Leider stimmt das gar nicht, Weil Fiffi die 400 haben müsste
Also wohl tatsächlich das Maximum, und nicht das „letzte“.
> // $datum[ $last\_date[0] ] = max($last\_date[2]); schlägt fehl
Toll - und was soll „schlägt fehl“ jetzt konkret bedeuten?
Wenn du schon deine Probleme nicht selber lösen kannst - dann \*beschreibe\* sie doch bitte wenigstens vernünftig.
Vermutlich bekommst du die Meldung
> Warning: max() [function.max]: When only one parameter is given, it must be an array
(Solltest du keine Meldung bekommen, dann hast du das error\_reporting nicht vernünftig eingestellt - in dem Fall mach das bitte als \*allererstes\*. Es ist ein wichtiges Hilfsmittel beim Programmieren. Und wenn dir das nichts sagt, dann informiere dich bitte!)
Und die Meldung ist natürlich berechtigt - von nur einem Wert das Maximum ermitteln zu wollen, ist mathematisch reichlich sinnfrei, das wäre nämlich immer genau dieser Wert.
Du könntest einfach abfragen, ob der aktuelle Wert für den jeweiligen Namen größer als der vorherige für diesen Namen ist, und wenn ja, den neuen Wert übernehmen. (Dabei musst du natürlich auch noch überprüfen, ob es überhaupt schon einen Eintrag für diesen Namen gibt.)
MfG ChrisB
--
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
Ich hab es nun doch selber (self) hinbekommen :)
$last_datum = array();
foreach ($wertungen as $val)
{
$name = $val[0];
$datum = $val[2];
if(isset($last_datum[$name])) {
$last_datum[$name] = max($last_datum[$name], $datum);
} else {
$last_datum[$name] = $datum;
}
}
Nun hat sich meine Frage dazu endlich erledigt
Gruss Fiffi
Hi,
Ich hab es nun doch selber (self) hinbekommen :)
Ja sicher, selber, schon klar - http://www.php.de/php-einsteiger/82946-erledigt-indiziertes-array-auswerten-2.html#post615658
MfG ChrisB
Hello,
Und die Meldung ist natürlich berechtigt - von nur einem Wert das Maximum ermitteln zu wollen, ist mathematisch reichlich sinnfrei, das wäre nämlich immer genau dieser Wert.
Das bringt mich zu der ketzerischen Frage, ob das für NULL auch gilt? ;-P
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi,
von nur einem Wert das Maximum ermitteln zu wollen, ist mathematisch reichlich sinnfrei, das wäre nämlich immer genau dieser Wert.
Das bringt mich zu der ketzerischen Frage, ob das für NULL auch gilt? ;-P
Mathematik kennt kein NULL, nur 0 ;-P
MfG ChrisB
Hallo,
<?php
$result = array();
foreach($vorkommen as $key => $value) {
// Entweder
// $result[$key] = array($value, $gesamt_punkte[$key]);
// oder
$anzahl = $value;
$wertung = $gesamt_punkte[$key];
$result[$key] = array(
'wertung' => $wertung,
'anzahl' => $anzahl
);
}
var_dump($result);
In anderen sprachen gibt es dafür "zip" aber ich finde das für PHP jetzt grad nicht.
Jeena
Huhuuuu Jeena,
du bekommst einen guten Morgen Bussi von mir. *knutsch
Mit einer kleinen Änderung:
statt: $gesamt_punkte[$key])
habe ich
$new_array[$key])
genommen und.....
.......
jaaaaaaaaaaaaa.
Danke dir 1000 mal für deine Hilfe.
Liebe Grüsse Fiffi