Multidimensionale Arrays und count / sizeof – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self Multidimensionale Arrays und count / sizeof Thu, 01 Nov 07 11:17:55 Z https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175301#m1175301 https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175301#m1175301 <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> Multidimensionale Arrays und count / sizeof Thu, 01 Nov 07 11:26:44 Z https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175302#m1175302 https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175302#m1175302 <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> Multidimensionale Arrays und count / sizeof Thu, 01 Nov 07 11:40:03 Z https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175303#m1175303 https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175303#m1175303 <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> Multidimensionale Arrays und count / sizeof Thu, 01 Nov 07 11:53:35 Z https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175304#m1175304 https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175304#m1175304 <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> Multidimensionale Arrays und count / sizeof Thu, 01 Nov 07 12:19:05 Z https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175305#m1175305 https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175305#m1175305 <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> Multidimensionale Arrays und count / sizeof Thu, 01 Nov 07 12:58:18 Z https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175306#m1175306 https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175306#m1175306 <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> Multidimensionale Arrays und count / sizeof Thu, 01 Nov 07 16:41:58 Z https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175307#m1175307 https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175307#m1175307 <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> Multidimensionale Arrays und count / sizeof Thu, 01 Nov 07 18:36:29 Z https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175308#m1175308 https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175308#m1175308 <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> Multidimensionale Arrays und count / sizeof Thu, 01 Nov 07 19:34:50 Z https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175311#m1175311 https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175311#m1175311 <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> Multidimensionale Arrays Thu, 01 Nov 07 23:22:24 Z https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175309#m1175309 https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175309#m1175309 <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> Multidimensionale Arrays Thu, 01 Nov 07 23:50:40 Z https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175310#m1175310 https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175310#m1175310 <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> Multidimensionale Arrays und count / sizeof Fri, 02 Nov 07 13:35:28 Z https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175312#m1175312 https://forum.selfhtml.org/self/2007/nov/1/multidimensionale-arrays-und-count-sizeof/1175312#m1175312 <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>