tag:forum.selfhtml.org,2005:/self Multidimensionale Arrays und count / sizeof – SELFHTML-Forum 2007-11-02T13:35:28Z https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175301#m1175301 Benjamin 2007-11-01T11:17:55Z 2007-11-01T11:17:55Z Multidimensionale Arrays und count / sizeof <p>Hallo,</p> <p>ich habe ein mehrdimensionales Array, bei dem ich in einer bestimmten "Tiefe" die Größe per count/sizeof ermitteln möchte. Allerdings weiß ich nicht, wie ich das realisieren kann.</p> <p>Ich möchte nicht Folgendes erreichen:<br> "<?php<br> $food = array('Obst' => array('Orange', 'Banane', 'Apfel'),<br>               'Gemüse' => array('Karrotte', 'Kohl', 'Erbse'));</p> <p>// rekursiv zählen<br> echo count($food, COUNT_RECURSIVE); // gibt 8 aus</p> <p>// normales zählen<br> echo count($food); // gibt 2 aus<br> ?>"</p> <p>Um es an diesem Beispiel zu erklären: ich möchte lediglich die Größe des Arrays unter dem Index 'Obst' ermitteln...</p> <p>Vorab vielen Dank für die Antworten und viele Grüße<br> Benjamin</p> https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175302#m1175302 Christian Seiler self@christian-seiler.de 2007-11-01T11:26:44Z 2007-11-01T11:26:44Z Multidimensionale Arrays und count / sizeof <p>Hallo Benjamin,</p> <blockquote> <p>Um es an diesem Beispiel zu erklären: ich möchte lediglich die Größe des Arrays unter dem Index 'Obst' ermitteln...</p> </blockquote> <p><code class="language-php"><span class="token function">count</span> <span class="token punctuation">(</span><span class="token variable">$food</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'Obst'</span><span class="token punctuation">]</span><span class="token punctuation">)</span></code></p> <p>Viele Grüße,<br> Christian</p> https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175303#m1175303 Benjamin 2007-11-01T11:40:03Z 2007-11-01T11:40:03Z Multidimensionale Arrays und count / sizeof <p>Danke für die Antwort, allerdings habe ich leider das Beispiel etwas unpassend gewählt...<br> Ich habe ein Array in der Session gespeichert und möchte die Größe der tieferen Ebene ermitteln.<br> <code class="language-php"><span class="token function">sizeof</span><span class="token punctuation">(</span><span class="token variable">$_SESSION</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'meinArray'</span><span class="token punctuation">]</span><span class="token punctuation">)</span></code><br> Die erste Ebene des Arrays ist assoziativ indexiert, die zweite numerisch.<br> Ich würde mich über weitere Hilfe freuen.</p> https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175304#m1175304 Christian Seiler self@christian-seiler.de 2007-11-01T11:53:35Z 2007-11-01T11:53:35Z Multidimensionale Arrays und count / sizeof <p>Hallo,</p> <blockquote> <p>Danke für die Antwort, allerdings habe ich leider das Beispiel etwas unpassend gewählt...<br> Ich habe ein Array in der Session gespeichert und möchte die Größe der tieferen Ebene ermitteln.<br> <code class="language-php"><span class="token function">sizeof</span><span class="token punctuation">(</span><span class="token variable">$_SESSION</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'meinArray'</span><span class="token punctuation">]</span><span class="token punctuation">)</span></code><br> Die erste Ebene des Arrays ist assoziativ indexiert, die zweite numerisch.<br> Ich würde mich über weitere Hilfe freuen.</p> </blockquote> <p>Das geht so ohne weiteres nicht. Warum? Weil in PHP es eigentlich keine mehrdimensionalen Arrays gibt. Mehrdimensionale Arrays werden in PHP nämlich so realisiert, dort Arrays wieder als Elemente des äußeren Arrays genommen werden. Die können auch andere Größe haben, zum Beispiel:</p> <pre><code class="block language-php"><span class="token variable">$array</span> <span class="token operator">=</span> <span class="token keyword">array</span> <span class="token punctuation">(</span> <span class="token keyword">array</span> <span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">array</span> <span class="token punctuation">(</span><span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Wenn Du programmiertechnisch sicherstellen kannst, dass die immer die gleiche Größe haben, dann kannst Du folgenden Code verwenden, um die "innere Dimension" zu bestimmen (ansonsten ist "innere Dimension" schlicht nicht definiert):</p> <pre><code class="block language-php"><span class="token variable">$schluessel</span> <span class="token operator">=</span> <span class="token function">array_keys</span> <span class="token punctuation">(</span><span class="token variable">$_SESSION</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'meinArray'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">count</span> <span class="token punctuation">(</span><span class="token variable">$schluessel</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// $_SESSION['meinArray'] ist in der ersten Ebene leer, also kann </span> <span class="token comment">// nicht bestimmt werden, wie viele Einträge in der zweiten Ebene </span> <span class="token comment">// wären... </span> <span class="token variable">$anzahl</span> <span class="token operator">=</span> <span class="token constant">null</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">is_array</span> <span class="token punctuation">(</span><span class="token variable">$_SESSION</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'meinArray'</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token variable">$schluessel</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// Der erste Schluessel von $_SESSION['meinArray'] ist keinem Array </span> <span class="token comment">// zugeordnet, also gibt's auch keine Anzahl Elemente... </span> <span class="token variable">$anzahl</span> <span class="token operator">=</span> <span class="token constant">null</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token variable">$anzahl</span> <span class="token operator">=</span> <span class="token function">count</span> <span class="token punctuation">(</span><span class="token variable">$_SESSION</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'meinArray'</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token variable">$schluessel</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> </code></pre> <p>Alternativ kannst Du auch sowas wie</p> <p><code class="language-php"><span class="token variable">$anzahl</span> <span class="token operator">=</span> <span class="token function">count</span> <span class="token punctuation">(</span><span class="token function">first</span> <span class="token punctuation">(</span><span class="token variable">$_SESSION</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'meinArray'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></p> <p>machen, das ist kürzer, allerdings stellt das den internen Positionszeiger von $_SESSION['meinArray'] um (was OK ist, wenn Du weißt, was das heißt, siehe halt die Doku zu first(), next(), key(), reset(), etc.) und hat keine Überprüfungen drin (was OK ist, wenn Du programmiertechnisch sicherstellst, dass der Array immer gültig und die richtige Form hat).</p> <p>Viele Grüße,<br> Christian</p> https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175305#m1175305 dedlfix 2007-11-01T12:19:05Z 2007-11-01T12:19:05Z Multidimensionale Arrays und count / sizeof <p>echo $begrüßung;</p> <blockquote> <p>Alternativ kannst Du auch sowas wie<br> <code class="language-php"><span class="token variable">$anzahl</span> <span class="token operator">=</span> <span class="token function">count</span> <span class="token punctuation">(</span><span class="token function">first</span> <span class="token punctuation">(</span><span class="token variable">$_SESSION</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'meinArray'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code><br> machen, [...] siehe halt die Doku zu first(), [...]</p> </blockquote> <p>Ich wollte mich schon freuen, dass es eine eindeutig benannte Funktion gibt, die ich bisher übersehen habe, andererseits wollte ich mich wundern, warum es nun eine neue Funktion gibt, deren Funktionalität man bisher auch gut mittels reset() bekommen hat, aber dann suchte ich die Dokumentation zu first(), doch leider vergebens ...</p> <p>echo "$verabschiedung $name";</p> https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175306#m1175306 Christian Seiler self@christian-seiler.de 2007-11-01T12:58:18Z 2007-11-01T12:58:18Z Multidimensionale Arrays und count / sizeof <p>Hallo dedlfix,</p> <blockquote> <blockquote> <p>Alternativ kannst Du auch sowas wie<br> <code class="language-php"><span class="token variable">$anzahl</span> <span class="token operator">=</span> <span class="token function">count</span> <span class="token punctuation">(</span><span class="token function">first</span> <span class="token punctuation">(</span><span class="token variable">$_SESSION</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'meinArray'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code><br> machen, [...] siehe halt die Doku zu first(), [...]</p> </blockquote> <p>Ich wollte mich schon freuen, dass es eine eindeutig benannte Funktion gibt, die ich bisher übersehen habe, andererseits wollte ich mich wundern, warum es nun eine neue Funktion gibt, deren Funktionalität man bisher auch gut mittels reset() bekommen hat, aber dann suchte ich die Dokumentation zu first(), doch leider vergebens ...</p> </blockquote> <p>Oh, dann hab ich das gerade mit einer anderen Programmiersprache verwechselt, ok, dann muss das natürlich heißen:</p> <pre><code class="block language-php"><span class="token function">reset</span> <span class="token punctuation">(</span><span class="token variable">$_SESSION</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'meinArray'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$anzahl</span> <span class="token operator">=</span> <span class="token function">count</span> <span class="token punctuation">(</span><span class="token function">next</span> <span class="token punctuation">(</span><span class="token variable">$_SESSION</span><span class="token punctuation">[</span><span class="token string single-quoted-string">'meinArray'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Viele Grüße,<br> Christian</p> https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175307#m1175307 Tom tom@bitworks.de http://selfhtml.bitworks.de 2007-11-01T16:41:58Z 2007-11-01T16:41:58Z Multidimensionale Arrays und count / sizeof <p>Hello,</p> <blockquote> <p>Oh, dann hab ich das gerade mit einer anderen Programmiersprache verwechselt, ok, dann muss das natürlich heißen:</p> <pre><code class="block"></code></pre> </blockquote> <p>reset ($_SESSION['meinArray']);</p> <blockquote> <p>$anzahl = count (next ($_SESSION['meinArray']));</p> </blockquote> <pre><code class="block"> Es müsste auch reichen   $anzahl = count(reset($\_SESSION['meinArray']));   ist ausprobiert und laut Manual auch logisch... Harzliche Grüße vom Berg <http://bergpost.annerschbarrich.de> Tom -- Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen Nur selber lernen macht schlau Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-) ![](http://bitworks.de/~selfHTML/Virencheck.gif) </code></pre> https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175308#m1175308 Andreas Görtz 2007-11-01T18:36:29Z 2007-11-01T18:36:29Z Multidimensionale Arrays und count / sizeof <p>Hi,</p> <blockquote> <blockquote> <pre><code class="block"></code></pre> </blockquote> </blockquote> <p>reset ($_SESSION['meinArray']);</p> <blockquote> <blockquote> <p>$anzahl = count (next ($_SESSION['meinArray']));</p> </blockquote> </blockquote> <pre><code class="block"> > > Es müsste auch reichen > >   $anzahl = count(reset($\_SESSION['meinArray'])); > >   ist ausprobiert und laut Manual auch logisch... nein, es ist beides falsch, da nicht berücksichtigt wird, ob das Array evtl. leer ist. Falls dies so ist, liefern sowohl reset() als auch next() boolean false und count(false) liefert 1, was in diesem Fall aber nicht erwünscht sein dürfte. Gruß, Andreas. </code></pre> https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175311#m1175311 Christian Seiler self@christian-seiler.de 2007-11-01T19:34:50Z 2007-11-01T19:34:50Z Multidimensionale Arrays und count / sizeof <p>Hallo Andreas,</p> <blockquote> <blockquote> <blockquote> <pre><code class="block language-php"></code></pre> </blockquote> </blockquote> </blockquote> <p>reset ($_SESSION['meinArray']);</p> <blockquote> <blockquote> <blockquote> <p>$anzahl = count (next ($_SESSION['meinArray']));</p> </blockquote> </blockquote> </blockquote> <pre><code class="block"> > > > > Es müsste auch reichen > > > >   $anzahl = count(reset($\_SESSION['meinArray'])); > > > >   ist ausprobiert und laut Manual auch logisch... > > nein, es ist beides falsch, da nicht berücksichtigt wird, ob das Array evtl. leer ist. Ja, Du hast natürlich Recht, aber das schrieb ich zur Lösung bereits dazu, dass da Überprüfungen fehlen, dass das äußere Array ausreichend viele Elemente hat. Wobei Tom natürlich recht hat, dass es besser und kürzer ist, den Rückgabewert von reset() zu nutzen, wenn man schon diesen Weg einschlägt. Viele Grüße, Christian </code></pre> https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175309#m1175309 Tom tom@bitworks.de http://selfhtml.bitworks.de 2007-11-01T23:22:24Z 2007-11-01T23:22:24Z Multidimensionale Arrays <p>Hello,</p> <blockquote> <blockquote> <blockquote> <p>reset ($_SESSION['meinArray']);<br> $anzahl = count (next ($_SESSION['meinArray']));</p> </blockquote> <p>Es müsste auch reichen</p> <p>$anzahl = count(reset($_SESSION['meinArray']));</p> <p>ist ausprobiert und laut Manual auch logisch...</p> </blockquote> <p>nein, es ist beides falsch, da nicht berücksichtigt wird, ob das Array evtl. leer ist. Falls dies so ist, liefern sowohl reset() als auch next() boolean false und count(false) liefert 1, was in diesem Fall aber nicht erwünscht sein dürfte.</p> </blockquote> <p>Gut, dass Du darauf hinweist.<br> Ich hatte vorhin zufällig gerade einen größern Array-Test auf dem Schirm für mein kleines PHP-Handbuch "Die Grenzen ausreizen"...</p> <p>Für die hiesige Fragestellung hatte ich allerdings einfach vorausgesetzt, dass man bereits weiß, dass die benutze Variable existiert und ein Array ist. Faulheit rächt sich aber!</p> <p>Ich empfehle daher, aufgrund Deiner Ermahnung und der Versuche, die ich ja eigentlich garade nochmal wiederholt habe:</p> <p>Bevor man in PHP mit einem Arrayelement irgendetwas anfängt, sollte man überprüfen,<br>    ob es überhaupt definiert ist und ob es wirklich ein Array ist.</p> <p>Anderenfalls gibt es erstaunliche Ergebnisse und leider selten eine Warnung / Notice.<br> Ich habe es auch schon mehrmals geschafft, durch entsprechende (falsche) Array-Operationen den Apachen (also sein PHP-Modul) zum Absturz zu bringen. Das Ding hat anschließend nur noch Quatsch gemacht.</p> <p>Besonders gut klappt das durch Zuweisung eines Arrays auf einen im Array gespeicherten Skalar.<br> Aber auch die implizite Deklaration führt hier manchmal zum "Erfolg"</p> <p>$_data['Hansen'] = "Hans";<br> $_data['Piller'] = "Paul";<br> $_data['Fröhlich'] = "Fritz";<br> $_data['Lummer'] = "Lieselotte";<br> $_data['sorglos'] = "Sabine";</p> <p>$_data['Fröhlich']['Adamski'] = 'Abraham';  ### Fehler! Subelement muss vorhanden sein</p> <p>Auf jeden Fall kommt dummes Zeug dabei heraus...</p> <p>Eigentlich sollte das zumindest einen Fehler geben. wahlweise</p> <ul> <li>warning: cannot redeklare Index imlicit</li> <li>notice: index not found</li> </ul> <p>oder sonstwas schlaues.</p> <p>Man bekommt den  Server damit jedenfalls aus dem Tritt und ich befürchte, dass das auch über den Weg $_POST, $_GET, $_COOKIE funktioniert. Soweit bin ich aber noch nicht vorgedrungen.</p> <p>Harzliche Grüße vom Berg<br> <a href="http://bergpost.annerschbarrich.de" rel="nofollow noopener noreferrer">http://bergpost.annerschbarrich.de</a></p> <p>Tom</p> <div class="signature">-- <br> Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen<br> Nur selber lernen macht schlau<br> Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)<br> <img src="http://bitworks.de/~selfHTML/Virencheck.gif" alt="" loading="lazy"><br> </div> https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175310#m1175310 dedlfix 2007-11-01T23:50:40Z 2007-11-01T23:50:40Z Multidimensionale Arrays <p>echo $begrüßung;</p> <blockquote> <p>$_data['Fröhlich'] = "Fritz";<br> $_data['Fröhlich']['Adamski'] = 'Abraham';  ### Fehler! Subelement muss vorhanden sein<br> Auf jeden Fall kommt dummes Zeug dabei heraus...</p> </blockquote> <p>Ja, es steht dann "Aritz" in $_data['Fröhlich'].</p> <blockquote> <p>Eigentlich sollte das zumindest einen Fehler geben. wahlweise</p> </blockquote> <p>Gibt es aber nicht, weil hier PHPs automatische Typumwandlung zusammen mit <a href="http://de.php.net/manual/en/language.types.string.php#language.types.string.substr" rel="nofollow noopener noreferrer">String access and modification by character</a> zuschlägt. Du hast einen String "Fritz" vorliegen. Auf dessen Zeichen kann man mit [index] zugreifen. "Fritz"[0] ist also das F. Da für den Index nur Zahlen verwendet werden können, wandelt PHP das 'Adamski' in eine Zahl um. Gemäß den <a href="http://de.php.net/manual/en/language.types.string.php#language.types.string.conversion" rel="nofollow noopener noreferrer">Typecast-Regeln für Strings</a> ergibt (int)'Adamski' also 0. Da man ein Zeichen nur mit einem anderen Zeichen, nicht aber mit mehreren überschreiben kann, wird nur das A von 'Abraham' genommen und ersetzt das F.</p> <p>(Ja, ich weiß, "Fritz"[0] ist keine gültige PHP-Syntax. Statt "Fritz" muss eine Variable stehen.)</p> <p>echo "$verabschiedung $name";</p> https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175312#m1175312 Andreas Görtz 2007-11-02T13:35:28Z 2007-11-02T13:35:28Z Multidimensionale Arrays und count / sizeof <p>Hi,</p> <blockquote> <p>aber das schrieb ich zur Lösung bereits dazu, dass da Überprüfungen fehlen, dass das äußere Array ausreichend viele Elemente hat.</p> </blockquote> <p>ich meinte die inneren Arrays, wo es nicht genügt zu prüfen/vorauszusetzen, dass die Anzahl der Elemente immer gleich ist, sondern sie muss auch größer 0 sein, damit man nicht 1 als Ergebnis bekommt. Allerdings habe ich in der Tat überlesen, dass du bereits auf die Gültigkeit des Arrays hingewiesen hast. Und leere Arrays wären nach der Aufgabenstellung auch ziemlich sinnfrei ;)</p> <p>Gruß,<br> Andreas.</p>