Anzahl der Werte eines Arrays zählen
jojo
- php
Ich habe ein mehrdimensionales Array $name['name']['nummer']
Jetzt möchte ich zählen, wie oft es "Nummer" mit dem Wert "n" gibt.
echo $begrüßung;
Ich habe ein mehrdimensionales Array $name['name']['nummer']
Genauer ausgedrückt hast du ein Array, das als Elemente weitere Arrays hat.
Jetzt möchte ich zählen, wie oft es "Nummer" mit dem Wert "n" gibt.
Dann mach das doch. Lauf dazu durch dein (äußeres) Array und analysiere die einzelnen Elemente. PHP bietet für das Durchlaufen Schleifenkonstrukte wie foreach an oder auch Array-Funktionen wie array_reduce() an.
echo "$verabschiedung $name";
Hallo,
ich geh davon aus, dass du was aus deiner Datenbank ausließt.
mit einer while().
Wen du dies tust definier doch einfach vor while eine variabel beispiel:
$zahl = 0;
$abfrage = "SELECT * FROM links WHERE id = '1'";
$ergebnis = mysql_query($abfrage);
while($row = mysql_fetch_array($ergebnis))
{
echo $row["url"]." <br>";
$zahl ++;
}
echo "<hr>Anzahl der zeilen : ".$zahl;
Mit freundlichen grüßen!!!
Ausnahmsweise hole ich diesmal das nicht aus der Datenbank. Es kommt von einem vorhergehenden Formular.
Ich habe mal in_array ausprobiert, aber leider hat es mit meiner Version nicht geholfen.
Hello,
Ich habe mal in_array ausprobiert, aber leider hat es mit meiner Version nicht geholfen.
Wie Du vorgehen musst, hängt auch von der von Dir gewählten Struktur und Deinen Vorgaben ab.
Wenn nur alle Elemente ['name'] der ersten Dimension auf ein Unterlelemtent ['nummer'], das ein Skalar ist, untersucht werden sollen, geht es doch mit einer einzigen foreach()-Schleife
foreach ($name['name'] as $key => $val)
{
if (isset($val['nummer']) and !is_array($val['nummer']))
{
if ($val['nummer'] == $nummer)
{
## aktion
}
}
else
{
error_log("MODUL XYZ: für [$name] fehlt das Element [nummer]\n");
}
}
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Ich glaube, ich habe einen Fehler beim Array erstellen. Als Fehlerdmeldung kommt nämlich:
Warning: Invalid argument supplied for foreach()
Ich habe es so deklariert:
$name = array(array());
$name['name']['nummer'];
Wie müsste es denn genau richtig sein, davon ausgehend, dass ich den Namen aus einem Formular bekomme, die Nummer jedoch erst im nachfolgenden Teil mache.
Hello,
Ich glaube, ich habe einen Fehler beim Array erstellen. Als Fehlerdmeldung kommt nämlich:
Warning: Invalid argument supplied for foreach()Ich habe es so deklariert:
$name = array(array());
$name['name']['nummer'];
Mach es in einzelschritten, dann klappt es auf jeden Fall:
$name = 'Hans';
$_namearr = array();
$_namearr[$name] = array();
$_namearr[$name]['nummer'] = 10;
Ich nehme an, dass Du Datenwerte (die Namen) als Schlüssel verwenden willst.
Du kannst das auch anders aufbauen:
$_user = array();
$_user['name'] = array();
$_user['visits'] = array();
$_user['name'][1] = 'Hans';
$_user['name'][2] = 'Paul';
$_user['name'][3] = 'Frieda';
$_user['visits'][1] = 0;
$_user['visits'][2] = 10;
$_user['visits'][3] = 2;
Nun korrespondiert immer ein Element der Liste $_user['name'] mit einem Element der Liste $_user['visits']. Das hat den Vorteil, dass Du die meisten Arrayfunktionen auf jede Liste anwenden kannst: Sortieren, Max, Min, usw.
Wenn Du dann den zugehörigen Namen zum größten visit-Wert suchst, ermittelst Du einfach den Schlüssel des größten Elementes und schaust, ob es in der anderen Liste einen Namen dazu gibt.
Außerdem hat diese Art des Aufbaus auch den Vorteil, dass sie beim Serialisieren erheblich weniger Platz benötigt.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Gut, danke für die drei Posts. Ich habe jetzt folgendes probiert:
$n = 100;
$r = 1;
$rang = array();
foreach($_POST['name'] as $key => $number)
{
if($number == $n)
$name[$key] = $r;
} else {
$zahl = 0;
foreach ($key as $key2 => $val)
{
if (isset($val[$r]) and !is_array($val[$r]))
{
echo 'Hier folgt val und r '.$val[$r].'';
if ($val[$r] == $r)
{
$zahl++;
echo 'Das hier ist zahl '.$zahl.'';
}
}
else
{
echo 'No, is not';
}
}
$r = ($r + $zahl);
while($number != $n) $n--;
$name[$key] = $r;
}
echo ''.var_dump($name).'<br>';
}
}
Heraus bekomme ich:
Warning: Invalid argument supplied for foreach()
array(1) { [Hans]=> int(1) }
This is direct: 1array(2) { [Hans]=> int(1) [Thomas]=> int(1) }
Warning: Invalid argument supplied for foreach()
array(3) { [Hans]=> int(1) [Thomas]=> int(1) [Dieter]=> int(1) }
This is direct: 1array(4) { [Hans]=> int(1) [Thomas]=> int(1) [Dieter]=> int(1) [Johannes]=> int(1) }
Warning: Invalid argument supplied for foreach()
array(5) { [Hans]=> int(1) [Thomas]=> int(1) [Dieter]=> int(1) [Johannes]=> int(1) [Ulf]=> int(1) }
Warning: Invalid argument supplied for foreach()
array(6) { [Hans]=> int(1) [Thomas]=> int(1) [Dieter]=> int(1) [Johannes]=> int(1) [Ulf]=> int(1) [Tom]=> int(1) }
Wird immer länger. $r sollte dabei eigentlich immer größer werden :\
Wo liegt der Fehler?
Hi,
meine ich das nur, oder sieht das, was du vorhast, dem hier verflixt aehnlich?
Wenn letzteres - dann unterlasse bitte kuenftig Doppelpostings.
Gut, danke für die drei Posts. Ich habe jetzt folgendes probiert:
foreach($_POST['name'] as $key => $number)
Und was steht in $_POST['name'] drin?
(Ich moechte nicht wissen, was du annimmst, was darin stuende, sondern was deine *Kontrolle* erbrahct hat.)
Heraus bekomme ich:
[code lang=html]Warning: Invalid argument supplied for foreach()
array(1) { [Hans]=> int(1) }
This is direct: 1array(2) { [Hans]=> int(1) [Thomas]=> int(1) }
Der Text "This is direct" kommt in deinem gezeigten Code gar nicht vor.
Wo liegt der Fehler?
Du zeigst uns nicht den richtigen Code, und du betreibst kein sinnvolles Debugging.
MfG ChrisB
Es steht das drin, was drin stehen sollte. Nämlich:
Hans 85
Thomas 85
Dieter 78
Johannes 78
Ulf 45
Tom 26
Das ist der ganze Code. Nur erst wollte ich die echo Ausgaben zur besseren Übersichtlichkeit weglassen, aber dann dachte ich, dass es dann vielleicht leichter ist zu erkennen, woran es vielleicht liegen könnte, daher habe ich es wieder reingetan, aber den einen vergessen:
if($number == $n) {
$name[$key] = $r;
echo 'This is direct: '.$rang[$key].'';
}
Mit eurem Ansatz habe ich es geschafft, ich bedanke mich sehr :D
echo $begrüßung;
Ich glaube, ich habe einen Fehler beim Array erstellen. Als Fehlerdmeldung kommt nämlich:
Warning: Invalid argument supplied for foreach()Ich habe es so deklariert:
$name = array(array());
Vermutlich unsinnig - betrachte bitte das Ergebnis mit einem var_dump($name); (vorher <pre> erhöht die Übersichtlichkeit der Ausgabe) -
$name['name']['nummer'];
und das ist eine Anweisung bei der sich nichts tut.
Wie müsste es denn genau richtig sein, davon ausgehend, dass ich den Namen aus einem Formular bekomme, die Nummer jedoch erst im nachfolgenden Teil mache.
Du möchtest also ein Array haben, das als Elemente weitere Arrays haben soll, die zunächst nur ein Element mit dem Schlüssel 'name' haben sollen und im weiteren Verlauf noch ein Element mit dem Schlüssel 'nummer' hinzubekommen sollen.
$das_array = array();
wird zunächst als komplett leer angelegt. Damit ist es auf alle Fälle ein Array, auch wenn keine Elemente hinzugefügt werden. Ein foreach darauf ergibt auch keine Warnung der obigen Art.
$das_array[] = array('name' => 'jojo');
Ein Element hinzufügen, das ein Array mit einem 'name'-Schlüssel und einem Wert ist. Der Schlüssel des Elements in $das_array ist beim ersten Element 0 und bei weiteren fortlaufend hochgezählt.
Auf das erste Element von $das_array greift man also mit $das_array[0] zu. Auf Elemente des in $das_array[0] stehenden Arrays greift man mit $das_array[0][schlüsselname] zu - lesend und schreibend, auch anlegend.
$das_array[0]['nummer'] = 42;
ergänzt das so, als ob jemand
$das_array[0] = array('name' => 'jojo', 'nummer' => 42);
notiert hätte. All das kannst du mit Kontrollausgaben (var_dump() oder auch print_r()) schön verfolgen.
Sinnvoll ist es sicher, das 'nummer'-Element gleich von Anfang an zu berücksichtigen und mit einem Dummy-Wert zu belegen, der später überschrieben werden kann. Ansonsten wäre bei jedem Lesezugriff eine Existenzprüfung à la Tom angebracht.
$das_array[] = array('name' => 'jojo', 'nummer' = 0);
echo "$verabschiedung $name";
echo $begrüßung;
Nachtrag meinerseits:
Mein Gedankengang geht von einer anderen Struktur aus, als du sie bereits angefangen hast.
Wenn du lediglich eine Zuordnung zwischen einem (unbedingt eindeutigen) Namen und einer (nicht unbedingt eindeutigen) Nummer haben möchtest, so kannst du ein einfaches Array erstellen.
$namen = array();
$namen['name1'] = nummer1;
$namen['name2'] = nummer2;
Voraussetzung ist wie gesagt, dass es keine Dopplungen bei den Namen gibt. Ansonsten wäre die Struktur aus meinem vorhergehenden Posting angebracht.
Erst wenn neben der Nummer weitere Daten zu einem Namen abgelegt werden sollen, empfiehlt sich ein verschachteltes Array.
$namen = array();
$namen['name1'] = array('nummer' => nummer1, 'daten' = daten);
$namen['name2'] = array('nummer' => nummer2, 'daten' = daten);
echo "$verabschiedung $name";
echo $begrüßung;
Ich habe mal in_array ausprobiert, aber leider hat es mit meiner Version nicht geholfen.
Sowas passiert, wenn du das "mehrdimensionale" Array als ein monolithisches Gebilde betrachtest. Für die Lösungsfindung bei Problemen mit verschachtelten Strukturen ist es günstiger, die Einzelteile getrennt zu bewerten.
PHPs Array-Funktionen sind meist nur auf eine Ebene ausgelegt. Verschachtelte Strukturen sind in der Mehrzahl der Fälle so individuell, dass sich dafür keine allgemeinen Funktionen lohnen. Ein Element eines Arrays unter PHP kann ja sowohl einen skalaren Wert als auch eine weitere Struktur in Form eines Arrays oder Objekts enthalten. Und das auch gemischt. Nicht ohen Grund hat Tom in seinem Lösungsvorschlag eine Prüfung auf Existenz des Elements mit dem Schlüssel nummer eingebaut.
if (isset($val['nummer']) and !is_array($val['nummer']))
Er geht sogar noch einen (halbherzigen) Schritt weiter, indem er das Element noch auf den Typ Array testet (angebrachter fände ich einen Test auf den Typ von "n" - is_numeric() beispielweise, wenn es sich um einen Zahlentyp handelt). Wenn du das Array selbst zusammenbaust und über die Struktur der inneren Elemente kein Zweifel besteht, dann ist diese Prüfung nicht unbedingt notwendig. Nicht weglassen sollte man sie, wenn man das Array aus externen Quellen bekommt und Grund zur Annahme von Unregelmäßigkeiten hat.
Für die Lösungsfindung empfehle ich, das Wort "mehrdimensional" und die damit verbundene Denkweise möglichst zu meiden und dein Augenmerk auf einen iterativen Ansatz mit foreach oder einen funktionalen mit array_reduce() zu legen.
echo "$verabschiedung $name";
Tach.
Ich habe ein mehrdimensionales Array $name['name']['nummer']
Jetzt möchte ich zählen, wie oft es "Nummer" mit dem Wert "n" gibt.
Abhängig davon, wie Dein Array konkret aussieht, bist Du entweder schneller mit selbstgestrickten foreach-Konstrukten oder mit array_walk_recursive(), welches eine Callbackfunktion aufruft, die überprüft, ob der Schlüssel "nummer" lautet und der zugehörige Wert n entspricht. In diesem Fall kannst Du beispielsweise einen Zähler mitlaufen lassen, den Du array_walk_recursive() als dritten Parameter in Form einer Referenz übergibst.