Prüfen, ob Wert in einem mehrdimensionalen Array vorhanden ist
Wolowitz
- php
Schönen guten Tag,
gegeben sei in Array in folgender Form:
$user = array();
$user['001']['name'] = 'Hans-Jürgen';
$user['001']['username'] = 'hanj';
$user['001']['pin'] = '3142';
$user['002']['name'] = 'Verena';
$user['002']['username'] = 'vere';
$user['002']['pin'] = '9441';
$user['003']['name'] = 'Ingeborg';
$user['003']['username'] = 'ingb';
$user['003']['pin'] = '9678';
Nun möchte ich überprüfen, ob es den Wert "vere" für ['username'] irgendwo gibt, und zwar _nur_ für diesen Index. Ein zufällig gleicher Wert für ['pin'] dürfte zu keinem TRUE führen! Und wenn der Wert vorhanden ist (wie in diesem Beispiel in der zweiten Gruppe, dann würde ich gerne den Gruppenindex (in diesem Fall also '002') wissen.
Alle meine bisherigen Versuche mit in_array oder array_search haben nur zu Fehlern geführt.
Gibt es eine kurze und elegante Möglichkeit, hier zu überprüfen, ob ein Username vorhanden ist und wenn ja, zu welcher "Usernummer" der gehört?
Ich weiß echt nicht mehr weiter und bedanke mich schon jetzt für jede Hilfe!
Mit lieben Grüßen
H. Wolowitz
foreach( $user as $userdata)
{
if( isset( $userdata['username'] ) && $userdata['username'] == "vere" )
{
//--- mach was
}
}
manchmal sind die Basics schneller umgesetzt. Bevor man eine magische Funktion bei php sucht. Zudem sind sie ab und an sogar schneller.
Gruß
Grundelemente Benutzer
T-Rex
Schönen guten Tag T-Rex,
foreach( $user as $userdata)
{
if( isset( $userdata['username'] ) && $userdata['username'] == "vere" )
{
//--- mach was
}
}
danke, damit bekomme ich schon mal raus, ob der Usernamen vorhanden ist im Array. Jetzt bleibt nur noch die Frage, wie ich den Namen des Arrays, in dem dieser steckt, herausbekomme. Also in dem Beispiel - wie ich auf die 002 komme. Hast Du dafür auch einen Vorschlag?
Mit lieben Grüßen
H. Wolowitz
Hallo,
foreach( $user as $userdata)
{
if( isset( $userdata['username'] ) && $userdata['username'] == "vere" )
{
//--- mach was
}
}danke, damit bekomme ich schon mal raus, ob der Usernamen vorhanden ist im Array. Jetzt bleibt nur noch die Frage, wie ich den Namen des Arrays, in dem dieser steckt, herausbekomme. Also in dem Beispiel - wie ich auf die 002 komme. Hast Du dafür auch einen Vorschlag?
Manual lesen. Die zweite Form der foreach-Syntax beschert dir genau das: Den Key des gerade untersuchten Elements.
Ciao,
Martin
Schönen guten Tag Martin,
Manual lesen. Die zweite Form der foreach-Syntax beschert dir genau das: Den Key des gerade untersuchten Elements.
Du meinst:
foreach (array_expression as $key => $value)
statement
Ich weiß nicht wirklich, wie ich das jetzt auf mein konkretes Beispiel anwenden soll.
Mit lieben Grüßen
H. Wolowitz
Hallo,
Manual lesen. Die zweite Form der foreach-Syntax beschert dir genau das: Den Key des gerade untersuchten Elements.
Du meinst:
foreach (array_expression as $key => $value)
genau das.
Ich weiß nicht wirklich, wie ich das jetzt auf mein konkretes Beispiel anwenden soll.
Wo genau liegt jetzt noch dein Problem? Nimm den von T-Rex vorgeschlagenen Ansatz, verwende aber die oben genannte erweiterte Syntax der foreach-Schleife. Dann hast du in jedem Schleifendurchlauf den aktuellen "Index" in $key.
Ciao,
Martin
Schönen guten Tag Martin,
Wo genau liegt jetzt noch dein Problem?
Das liegt, wie ich bereits sagte, daran, dass ich nicht weiß, wie ich das jetzt auf mein konkretes Beispiel anwenden soll
Nimm den von T-Rex vorgeschlagenen Ansatz, verwende aber die oben genannte erweiterte Syntax der foreach-Schleife. Dann hast du in jedem Schleifendurchlauf den aktuellen "Index" in $key.
Beim Herumprobieren mit der. 2. Form des foreach bin ich in den letzten Tagen leider nicht weitergekommen.
Ich habe jetzt eine, wie ich finde, sehr viel simplere Lösung gefunden. (Siehe mein Posting "Meine Lösung").
Mit lieben Grüßen
H. Wolowitz
Tach!
Wo genau liegt jetzt noch dein Problem?
Das liegt, wie ich bereits sagte, daran, dass ich nicht weiß, wie ich das jetzt auf mein konkretes Beispiel anwenden soll
Solche allgemeinen Aussagen helfen mir als Antwortendem auch wenig. Ich weiß dann nämlich nicht, wo konkret ich ansetzen soll, außer das Gesagte nochmal anders zu formulieren, in der Hoffnung, dass es nur das war.
Nimm den von T-Rex vorgeschlagenen Ansatz, verwende aber die oben genannte erweiterte Syntax der foreach-Schleife. Dann hast du in jedem Schleifendurchlauf den aktuellen "Index" in $key.
Beim Herumprobieren mit der. 2. Form des foreach bin ich in den letzten Tagen leider nicht weitergekommen.
Warum nicht? Was waren die konkreten Probleme? Denn damit kommst du noch einfacher ohne ein zusätzliches Feld aus.
Nehmen wir noch einmal deine Struktur und schreiben sie so, wie sie am Ende wirklich aussieht (auch mit var_dump()/print_r() kontrollierbar).
$user = array();
$user['001']['name'] = 'Hans-Jürgen';
$user['001']['username'] = 'hanj';
$user['001']['pin'] = '3142';
$user['002']['name'] = 'Verena';
$user['002']['username'] = 'vere';
$user['002']['pin'] = '9441';
$user['003']['name'] = 'Ingeborg';
$user['003']['username'] = 'ingb';
$user['003']['pin'] = '9678';
Anders geschrieben:
$user = array(
'001' => array(
'name' => 'Hans-Jürgen',
'username' => 'hanj',
'pin' => '3142',
),
'002' => array(
'name' => 'Verena',
'username' => 'vere',
'pin' => '9441',
),
'003' => array(
'name' => 'Ingeborg',
'username' => 'ingb',
'pin' => '9678',
),
);
Jetzt solltest du erkennen, was du wirklich hast: Ein (äußeres) Array mit den Keys 001, 002 und 003. Die Werte dazu sind jeweils ein Array mit den Daten zu den Personen.
Ein
echo '<pre>';
foreach ($user as $key => $value) {
var_dump($key);
print_r($value);
echo "-----------\n";
}
sollte dir nun zeigen, dass du im $key bereits 001, 002 und 003 gebrauchsfertig stehen hast. $value ist das jeweilige Datensatz-Array dazu. Suche in diesem Datensatz-Array, was du suchen willst und brich beim Finden die Schleife mit break ab. $key und $value bleiben auch nach der Schleife erhalten und enthalten die Daten der Fundstelle.
dedlfix.
Schönen guten Tag dedlfix,
Nimm den von T-Rex vorgeschlagenen Ansatz, verwende aber die oben genannte erweiterte Syntax der foreach-Schleife. Dann hast du in jedem Schleifendurchlauf den aktuellen "Index" in $key.
Suche in diesem Datensatz-Array, was du suchen willst und brich beim Finden die Schleife mit break ab. $key und $value bleiben auch nach der Schleife erhalten und enthalten die Daten der Fundstelle.
OK, ich sehe ein, dass ich mir dadurch die doppelte Angabe der Nummer ersparen kann und mache es jetzt genau so, wie von Dir vorgeschlagen.
foreach ( $user as $key => $value )
{
if ( ( $given_name == $value['username'] ) AND ( $given_pin == $value['pin'] ) )
{
$number = $key;
}
}
Danke für die Verbesserung meiner Lösung!
Mit lieben Grüßen
H. Wolowitz
Tach!
Suche in diesem Datensatz-Array, was du suchen willst und brich beim Finden die Schleife mit break ab. $key und $value bleiben auch nach der Schleife erhalten und enthalten die Daten der Fundstelle.
OK, ich sehe ein, dass ich mir dadurch die doppelte Angabe der Nummer ersparen kann und mache es jetzt genau so, wie von Dir vorgeschlagen.
Einen kleinen Hinweis hab ich noch:
foreach ( $user as $key => $value )
{
if ( ( $given_name == $value['username'] ) AND ( $given_pin == $value['pin'] ) )
{
$number = $key;
}
}
Die Namen $key und $value hab ich nur für das allgemeine Schau-dir-die-Struktur-an-Beispiel verwendet. Du solltest auch bei Variablen versuchen, die Dinge bei ihrem richtigen Namen zu nennen, damit deine Absicht deutlicher wird (für andere und dein anderes Ich, das vier Wochen später auf den Code schaut und ihn zu verstehen versucht), was du in dieser Variable abzulegen gedenkst.
In $user befindet sich nicht nur ein User sondern mehrere, also wäre $users angebracht. Wenn du dann durch diese Menge durchläufst, um einzelne User zu behandeln, hast du dann den Namen $user in der Einzahl dafür frei. Der Key in deinem User-Array ist nicht einfach nur ein bedeutungsloser $key sondern er ist eine Nummer (wofür auch immer sie konkret steht, das kann man sicher auch noch präzisieren).
Das foreach kannst du also aussagekräftiger umschreiben zu
foreach ($users as $number => $user)
Dann sollte dir auffallen, dass du $number nicht unbedingt extra speichern musst, sondern dass sie schon in einer Variablen steht. Es reicht dann statt der Zuweisung ein einfacher Abbruch (vermeidet auch das weitere unnötige Durchlaufen bis zu <del>bitteren</del> Ende), woraufhin du neben der Nummer gleich noch den User zugriffsfertig in einer zweiten Variablen stehen hast. - Allerdings hat die Geschichte auch noch einen Haken, den ich bei meiner vorherigen Antwort noch übersehen hatte. Was ist, wenn kein User gefunden wird? In der jetzigen Ausführung zeigt dann $number und $user auf den letzten Eintrag und man weiß nicht, ob das eine Fundstelle war oder keine. Noch einmal vergleichen wäre nicht so schön. Eine Möglichkeit ist, nach dem if, $number und $user auf null zu setzen: $number = $user = null; Wenn ein Abbruch wegen Findens stattfindet, wird die Zuweisung nicht ausgeführt, ansonsten doch, und beim letzten Datensatz endet danach die Schleife.
Die Zuweisung jedes Mal ist aus meiner Sicht das kleinere Übel. Eine Alternative wäre der Code wie du ihn jetzt hast, dann bekommst du aber ein Benennungsproblem(chen). Entweder bleibst du beim allgemeinen nichtvielsagenden $key-$value-Pärchen oder nimmst $number\_in\_der\_schleife oder ein ähnliches nicht besonders tolles Hilfskonstrukt. Jedenfalls müsste noch (auch wenn du an deiner jetzigen Lösung eigentlich nichts mehr ändern möchtest) $number vor dem foreach um eine Initialisierung ergänzt werden, sonst ist diese Variable nach einem Nicht-Finden nicht existent, was beim nächsten Lesezugriff mindestens eine Notice-Meldung verursacht, wenn das error\_reporting auf E\_ALL steht.
dedlfix.
Schönen guten Tag dedlfix,
Du solltest auch bei Variablen versuchen, die Dinge bei ihrem richtigen Namen zu nennen, damit deine Absicht deutlicher wird (für andere und dein anderes Ich, das vier Wochen später auf den Code schaut und ihn zu verstehen versucht), was du in dieser Variable abzulegen gedenkst.
das sehe ich auch so, ich bin jetzt allerdings absichtlich 1:1 bei den Namen geblieben, damit sichergestellt ist, dass wir auch immer von der selben Sache sprechen.
Dann sollte dir auffallen, dass du $number nicht unbedingt extra speichern musst, sondern dass sie schon in einer Variablen steht.
Das war noch ein rudimentärer Code aus meinem Labor. Ich hatte, als ich Dein Beispiel getestet habe, die Variable $number mit "Keine Nummer gefunden" vordefiniert und mir am Ende des Skripts ausgeben lassen. Somit stand da dann entweder eine Nummer oder, wenn ich den Suchbegriff absichtlich falsch genommen habe, ein "Keine Nummer gefunden". Du selbst hast mich ja gelehrt, man soll immer sämtliche Teile eines Skripts in allen möglichen Szenarien durchtesten, um zu sehen, was passiert! =)
Es reicht dann statt der Zuweisung ein einfacher Abbruch
In diesem speziellen Fall habe ich maximal 5 bis 10 solcher "Datensätze". Da kann ich das komplette Durchlaufen der Schleife verkraften.
Allerdings hat die Geschichte auch noch einen Haken, den ich bei meiner vorherigen Antwort noch übersehen hatte. Was ist, wenn kein User gefunden wird?
Dafür folgt dann nach dem IF noch ein ELSE.
$number vor dem foreach um eine Initialisierung ergänzt werden, sonst ist diese Variable nach einem Nicht-Finden nicht existent
Das habe ich ja, wie gerade geschrieben, eh gemacht.
was beim nächsten Lesezugriff mindestens eine Notice-Meldung verursacht, wenn das error_reporting auf E_ALL steht.
Wenn ich an einem Skript arbeite, dann steht bei mir bis zur Fertigstellung _immer_ ein error_reporting(E_ALL|E_STRICT);
im Header!
Mit lieben Grüßen
H. Wolowitz
Nur für dich:
function trex_gives_me_this_power( $arArray, $strUserName, $boolGetAll = false )
{
$arGetAll = array();
foreach( $user as $key => $userdata)
{
if( isset( $userdata['username'] ) && $userdata['username'] == $strUserName )
{
if( !$boolGetAll )
{
return $key;
} else {
$arGetAll[ $key ] = $key;
}
}
}
return $arGetAll;
}
//--- Aufruf
trex_gives_me_this_power( $arArray, "vere" ); //--- Rückgabe erster Index in dem der Username "vere" ist
trex_gives_me_this_power( $arArray, "vere", true ); //--- Rückgabe alle Index in dem der Username "vere" - Rückgabe als Array
Wenn du den Namen der Funktion bei behältst brauchste dich nicht mal bei mir bedanken :D.
Gruß
super cooler
T-Rex
Schönen guten Tag T-Rex,
danke für die Funktion, aber das war mir alles viel zu kompliziert und umständlich. Ich habe jetzt eine, wie ich finde, sehr viel simplere Lösung gefunden. (Siehe mein Posting "Meine Lösung").
Danke für den Input mit dem foreach! Das war's!
Mit lieben Grüßen
H. Wolowitz
Tach!
gegeben sei in Array in folgender Form:
Das ist nicht "ein Array" und auch kein "mehrdimensionales Array". Das sind viele Arrays, ineinander verschachtelt.
Alle meine bisherigen Versuche mit in_array oder array_search haben nur zu Fehlern geführt.
Diese Funktionen berücksichtigen ja auch immer nur ein einzelnes Array und nicht viele. Und du kannst beiden Funktionen keine selbst definierte Selektionsfunktion übergeben. Die suchen nur nach kompletten Werten, nicht in Teilen der Elemente.
Gibt es eine kurze und elegante Möglichkeit, hier zu überprüfen, ob ein Username vorhanden ist und wenn ja, zu welcher "Usernummer" der gehört?
Du musst auf alle Fälle durch das äußere Array laufen und die Unterarrays einzeln betrachten. Iterativ mit foreach und in dessen Body ein Vergleich nebst Abbruch bei Übereinstimmung oder funktional mit array_filter() und selbst geschriebener Vergleichsfunktions.
Prüfe außerdem, ob sich nicht gleich der Username als Keys des äußeren Arrays verwenden lässt. Damit ergibt sich das Eindeutig-Sein von selbst und die Prüfung beschränkt sich auf ein isset().
dedlfix.
Schönen guten Tag dedlfix,
Das ist nicht "ein Array" und auch kein "mehrdimensionales Array". Das sind viele Arrays, ineinander verschachtelt.
Wieso soll das kein mehrdimensionales Array sein? Ich sehe doch, _dass_ es eines ist, wenn ich es mit var_dump($user);
überprüfe!
Diese Funktionen berücksichtigen ja auch immer nur ein einzelnes Array und nicht viele.
$user ist _ein_ Array. Ein mehrdimensionales.
Deine Antwort war mir leider keine Hilfe, ich verstehe auch nicht, was Du mir mit dem Rest genau sagen willst.
Mit lieben Grüßen
H. Wolowitz
Hallo,
Das ist nicht "ein Array" und auch kein "mehrdimensionales Array". Das sind viele Arrays, ineinander verschachtelt.
Wieso soll das kein mehrdimensionales Array sein? Ich sehe doch, _dass_ es eines ist, wenn ich es mitvar_dump($user);
überprüfe!
nein, du siehst ein Array, dessen Elemente wiederum Arrays sind. Echte mehrdimensionale Arrays, also zwei oder mehr Indices unter _einem_ Bezeichner, kennt PHP gar nicht.
Echte mehrdimensionale Arrays gibt es beispielsweise in C:
int foo[16][100];
Diese Funktionen berücksichtigen ja auch immer nur ein einzelnes Array und nicht viele.
$user ist _ein_ Array. Ein mehrdimensionales.
$user ist _ein_ Array, korrekt. Ein _ein_dimensionales (weil's andere nicht gibt). Eines, das seinerseits wieder Arrays enthält.
Deine Antwort war mir leider keine Hilfe, ich verstehe auch nicht, was Du mir mit dem Rest genau sagen willst.
Dass du eine verzweigte Datenstruktur hast, die in der Form von keiner vorgefertigten PHP-Funktion abgedeckt wird, und deshalb selbst Hand anlegen musst. - Wobei ich anhand deines Beispiels nicht verstanden habe, ob du auch nach Teilausdrücken suchen, also mit "vere" beispielsweise auch "Verena" finden möchtest. Falls ja, würde dir der Vorschlag von dedlfix, den Usernamen als Key (Index) zu verwenden, nicht unmittelbar helfen.
Ciao,
Martin
Tach!
Das ist nicht "ein Array" und auch kein "mehrdimensionales Array". Das sind viele Arrays, ineinander verschachtelt.
Wieso soll das kein mehrdimensionales Array sein? Ich sehe doch, _dass_ es eines ist, wenn ich es mitvar_dump($user);
überprüfe!
Es gibt in PHP so etwas wie mehrdimensionale Arrays im eigentlichen Sinne nicht. Sie als solche zu betrachten führt meist zu Denkfehlern beim Suchen von Lösungen. Stattdessen ist es, und genau das zeigt dir auch das var_dump(), ein Array of Arrays.
Diese Funktionen berücksichtigen ja auch immer nur ein einzelnes Array und nicht viele.
$user ist _ein_ Array. Ein mehrdimensionales.
Nein. Es ist ein einfaches Array. Und dessen Elemente sind zufälligerweise ebenfalls Arrays. Das müssten sie aber nicht sein, es könnten skalare Werte gemischt mit komplexen Typen wie Arrays oder Objekten enthalten sein. Sowas müssten alle Array-Funktionen, die sich auf mehr als eine Ebene beziehen, berücksichtigen. Es ist aber ein Unding, da allgemeine Regeln zu finden, um Funktionsn für verschachtelte Strukturen zu schreiben. Zu unterschiedlich sind die Bedürfnisse und tatsächlichen Strukturen der PHP-Arrays bei den Anwendern.
Deine Antwort war mir leider keine Hilfe, ich verstehe auch nicht, was Du mir mit dem Rest genau sagen willst.
Du musst umdenken und die Struktur als Array of Arrays betrachten. Dann durch das äußere gehen und die inneren Arrays als jeweils eigenständiges Gebilde akzeptieren. Du suchst also zu ermitteln, ob es ein solches eigenständiges Gebilde mit dem gesuchten Usernamen existiert.
dedlfix.
Schönen guten Tag dedlfix,
Du musst umdenken und die Struktur als Array of Arrays betrachten.
Und tausende von Internetseiten sagen mir, dass man _genau das_ als "mehrdimensionales Array" bezeichnet.
Dann durch das äußere gehen und die inneren Arrays als jeweils eigenständiges Gebilde akzeptieren. Du suchst also zu ermitteln, ob es ein solches eigenständiges Gebilde mit dem gesuchten Usernamen existiert.
Und kannst Du das nur lyrisch ausdrucken oder mir auch mit Hilfe eines Codes auf die Sprünge helfen?
Mit lieben Grüßen
H. Wolowitz
Hi,
Du musst umdenken und die Struktur als Array of Arrays betrachten.
Und tausende von Internetseiten sagen mir, dass man _genau das_ als "mehrdimensionales Array" bezeichnet.
genaugenommen sind schon die "einfachen" Arrays von PHP keine wirklichen Arrays. Ein Array ist nämlich im Grunde eine Zusammenfassung mehrerer Elemente _desselben_Typs_, die mit einem Bezeichner und einem skalaren, abzählbaren Index angesprochen werden.
PHP bricht gleich in zwei Aspekten aus dieser Definition aus. Zum einen kann in PHP jedes Element des "Arrays" einen anderen Datentyp haben, und zum anderen erlaubt PHP auch Strings als "Index". Das ganze Gebilde ist daher eher ein Objekt (oder struct, wenn man mit C vergleichen möchte), aber nicht wirklich ein Array.
Bei einem echten mehrdimensionalen Array kommt noch dazu, dass zu jeder Kombination gültiger Indices auch ein Element existiert, während die "mehrdimensionalen Arrays" von PHP in dieser Hinsicht durchaus unvollständig sein können.
Dann durch das äußere gehen und die inneren Arrays als jeweils eigenständiges Gebilde akzeptieren. Du suchst also zu ermitteln, ob es ein solches eigenständiges Gebilde mit dem gesuchten Usernamen existiert.
Und kannst Du das nur lyrisch ausdrucken oder mir auch mit Hilfe eines Codes auf die Sprünge helfen?
Siehe Ansatz von T-Rex.
Ciao,
Martin
gudn tach!
Das ist nicht "ein Array" und auch kein "mehrdimensionales Array". Das sind viele Arrays, ineinander verschachtelt.
Wieso soll das kein mehrdimensionales Array sein? Ich sehe doch, _dass_ es eines ist, wenn ich es mitvar_dump($user);
überprüfe!Es gibt in PHP so etwas wie mehrdimensionale Arrays im eigentlichen Sinne nicht. Sie als solche zu betrachten führt meist zu Denkfehlern beim Suchen von Lösungen. Stattdessen ist es, und genau das zeigt dir auch das var_dump(), ein Array of Arrays.
ein array of arrays wird normalerweise in der programmierung auf pragmatischer ebene als mehrdimensionales array bezeichnet. dass das ding intern sonstwie gespeichert ist, tut hier nichts zur sache; damit will man sich ja insb. als scriptsprachen-programmierer eben gerade _nicht_ auseinandersetzen.
aus dem php-manual:
"An array in PHP is actually an ordered map. A map is a type that associates values to keys. This type is optimized for several different uses; it can be treated as an array, list (vector), hash table (an implementation of a map), dictionary, collection, stack, queue, and probably more. As array values can be other arrays, trees and multidimensional arrays are also possible." (http://www.php.net/manual/language.types.array.php)
wenn man bezeichnungen _persoenlich_ nicht mag, ist das eine sache. es ist jedoch verwirrend, demotivierend und contra-produktiv anderen leuten gegenueber (besonders leuten, die fragen stellen), hyper-pedantisch deren formulierungen auseinanderzunehmen, obwohl diese formulierungen sogar gaengig sind.
(und bevor jetzt wieder jemand einwendet, dass man aber doch sprachlich nichts falsches sagen duerfe und es doch hilfreich sei, jemanden zu korrigieren...: besonders in der sprache gibt es selten ein mathe-aehnliches richtig/falsch, sondern sprache wird durch die sprecher definiert. "array of arrays" wird normalerweise synonym zu "mehrdimensionales array" verwendet. in einem "hundekuchen" sind normalerweise keine hunde, auch wenn der erdbeerkuchen und der bananenkuchen etwas anderes suggerieren koennten. eine ziffer ist im mathematischen kontext eine einstellige zahl. und eine tuer kann man oeffnen, auch wenn man eigentlich damit nur den raum oeffnet. usw. usf. anders gesagt: es ist gar keine korrektur, sondern bloss eine andere meinung.)
joah, sorry, manchmal bekomm ich einen rappel und steiger mich dann so rein. :-)
prost
seth
Hallo,
ein array of arrays wird normalerweise in der programmierung auf pragmatischer ebene als mehrdimensionales array bezeichnet.
ja, normalerweise würde ich auch nichts gegen diese pragmatische Formulierung einwenden.
dass das ding intern sonstwie gespeichert ist, tut hier nichts zur sache; damit will man sich ja insb. als scriptsprachen-programmierer eben gerade _nicht_ auseinandersetzen.
Wie es intern genau gespeichert und verwaltet wird, ist in der Tat belanglos, da sind wir uns einig. Die Erkenntnis, dass man es nicht mit _einem_ homogenen "Datenobjekt" zu tun hat, sondern mit mehreren, ist in diesem Fall aber der Schlüssel zum Verständnis, warum die herkömmlichen Array-Funktionen nicht das leisten, was Wolowitz erwartet. In so einem Fall _muss_ man es mal genau nehmen.
In der Alltagssprache ist auch die Formulierung okay, dass "im Sommer viele Holländer auf unseren Autobahnen unterwegs sind". Wenn man aber selbst "nach Holland" fährt, kann es auf einmal wichtig sein zu erkennen, dass "Holland" nur eine Provinz der Niederlande ist (noch präziser: sogar zwei, nämlich Noord-Holland und Zuid-Holland).
joah, sorry, manchmal bekomm ich einen rappel und steiger mich dann so rein. :-)
It's just perfectly normal paranoia. Everybody in the universe has that. [Douglas Adams]
Ciao,
Martin
Tach!
ein array of arrays wird normalerweise in der programmierung auf pragmatischer ebene als mehrdimensionales array bezeichnet. dass das ding intern sonstwie gespeichert ist, tut hier nichts zur sache; damit will man sich ja insb. als scriptsprachen-programmierer eben gerade _nicht_ auseinandersetzen.
Er muss sich aber, wenn er mit der Struktur etwas anfangen will. Es geht auch nicht daraum, wie PHP intern das Array aufbaut, sondern wie es sich für den Programmierer darstellt. Und dann ist es eben ein Array of Arrays. Oder noch genauer, eine Map of Maps.
aus dem php-manual:
"An array in PHP is actually an ordered map. A map is a type that associates values to keys. This type is optimized for several different uses; it can be treated as an array, list (vector), hash table (an implementation of a map), dictionary, collection, stack, queue, and probably more. As array values can be other arrays, trees and multidimensional arrays are also possible." (http://www.php.net/manual/language.types.array.php)
"are possible" - das heißt, man kann sie nachbilden. Dann sollten sie aber auch genauso wie echte mehrdimensionale Arrays aussehen und gleichmäßig in ihre Richtungen streben, unter Verwendung von numerischen Schlüsseln, die eine Position angeben. Nur weil ein PHP-Array all die genannten Strukturen abbilden kann, heißt es nicht, dass jeder dieser Begriffe dasselbe meint und alle untereinander austauschbar sind.
wenn man bezeichnungen _persoenlich_ nicht mag, ist das eine sache. es ist jedoch verwirrend, demotivierend und contra-produktiv anderen leuten gegenueber (besonders leuten, die fragen stellen), hyper-pedantisch deren formulierungen auseinanderzunehmen, obwohl diese formulierungen sogar gaengig sind.
Es geht mir nicht darum, die richtigen Begriffe nur um ihrer selbst Willen zu verwenden. Wenn jedoch die falsche Verwendung von Begriffen dazu führt, dass das eigentliche Problem nicht erkannt werden kann, dann ist es meiner Meinung nach nicht förderlich, nicht über den Irrtum auszuklären.
Ich sehe hier ja immer wieder die Fragen nach der Behandlung "mehrdimensionaler" Arrays, bei denen dann versucht wird, mit einfachen Funktionen zum Ergebnis zu kommen. Meiner Meinung nach trüge es sehr zum Verständnis bei, sich die wirkliche Struktur genauer anzuschauen und sie dann auch korrekt zu bezeichnen. Dann sähe man, das man ein Array hat und darin viele - oder auch Arrays neben einfachen Werten - dass man zum Beispiel einen Baum statt eines Feldes vor sich hat und darauf nicht mit dem Pflug losgehen kann - dass die einfachen Array-Funktionen nicht allein für die Problemlösung taugen.
(und bevor jetzt wieder jemand einwendet, dass man aber doch sprachlich nichts falsches sagen duerfe und es doch hilfreich sei, jemanden zu korrigieren...: besonders in der sprache gibt es selten ein mathe-aehnliches richtig/falsch, sondern sprache wird durch die sprecher definiert. "array of arrays" wird normalerweise synonym zu "mehrdimensionales array" verwendet.
Natürlich darf man falsche oder auch umgangssprachliche Begriffe verwenden. Dagegen ist meinerseits nichts generelles einzuwenden. Nur darf dabei das Verständnis nicht auf der Strecke bleibt. Man bezeichnet ja die Dinge unterschiedlich, um die Unterschiede deutlich zu machen.
joah, sorry, manchmal bekomm ich einen rappel und steiger mich dann so rein. :-)
... und mit dem Kuchenvergleich bist du deutlich übers Ziel hinausgeschossen.
dedlfix.
gudn tach!
echte mehrdimensionale Arrays
tja, nun gehen aber die meinungen auseinander, was ein array ist, geschweige denn, was ein "echtes" array ist. klar, in der c-welt ist das noch recht einfach. da gibt's statische arrays und dynamische. in c++ wird's schon schwammiger, denn da bezeichnet man nicht nur die arrays, die's in c schon gab, als arrays, sondern auch hin und wieder z.b. std::vector und aehnliches. wenn man die arrays aus c meint, muss man dagegen deutlich von c-style-arrays sprechen, um nicht ggf. missverstanden zu werden.
nimmt man das attribut "mehrdimensional" hinzu, wird's nur noch mehrdeutiger. in java wird aehnlich wie in php bei "arrays of arrays" von mehrdimensionalen arrays gesprochen, vgl. Java ist auch eine Insel, 3.8.10 Mehrdimensionale Arrays
Es geht mir nicht darum, die richtigen Begriffe nur um ihrer selbst Willen zu verwenden.
worauf ich hinaus will: es gibt haeufig nicht "die richtigen begriffe", so auch in diesem fall.
Wenn jedoch die falsche Verwendung von Begriffen dazu führt,
und auch hier: die verwendung von wolowitz, dem php-manual, dem genannten java-buch usw. ist nicht falsch.
dass das eigentliche Problem nicht erkannt werden kann, dann ist es meiner Meinung nach nicht förderlich, nicht über den Irrtum auszuklären.
man haette hier das problem loesen koennen, ohne dem OP vorzuwerfen, einen begriff vermeintlich falsch benutzt zu haben. (er hat ihn naemlich gar nicht falsch benutzt.)
Ich sehe hier ja immer wieder die Fragen nach der Behandlung "mehrdimensionaler" Arrays, bei denen dann versucht wird, mit einfachen Funktionen zum Ergebnis zu kommen. Meiner Meinung nach trüge es sehr zum Verständnis bei, sich die wirkliche Struktur genauer anzuschauen
darin stimme ich dir vollkommen zu. das heisst aber nicht, dass man diese dinger nicht "mehrdimensionale arrays" nennen darf.
und sie dann auch korrekt zu bezeichnen.
du bist es evtl. gewohnt, den begriff anders zu verwenden. andere sind es aber anders gewohnt. wer hat nun recht? beide, solange sie nicht den jeweils anderen als falschen begriffsverwender darstellen wollen.
Dann sähe man, das man ein Array hat und darin viele - oder auch Arrays neben einfachen Werten - dass man zum Beispiel einen Baum statt eines Feldes vor sich hat und darauf nicht mit dem Pflug losgehen kann - dass die einfachen Array-Funktionen nicht allein für die Problemlösung taugen.
ganz genau. darin sind wir uns vermutlich alle einig.
(und bevor jetzt wieder jemand einwendet, dass man aber doch sprachlich nichts falsches sagen duerfe und es doch hilfreich sei, jemanden zu korrigieren...: besonders in der sprache gibt es selten ein mathe-aehnliches richtig/falsch, sondern sprache wird durch die sprecher definiert. "array of arrays" wird normalerweise synonym zu "mehrdimensionales array" verwendet.
Natürlich darf man falsche oder auch umgangssprachliche Begriffe verwenden.
was ich sagen wollte: es ist gar nicht falsch, es schwirren unterschiedliche definitionen rum. solange es keine einheitliche definition dazu gibt, muss man grundsaetzlich alle akzeptieren. wenn man, wie du oder ich, weiss, dass es versch. definitionen gibt, sieht man meist eh aus dem kontext, was gemeint ist. und wenn nicht, kann man nachfragen. man sollte aber nicht die aus geschmacklichen gruenden praeferierte version als die einzig richtige verkaufen.
Man bezeichnet ja die Dinge unterschiedlich, um die Unterschiede deutlich zu machen.
wenn's denn so einfach waere. selbst in der mathematik muss man jedes mal zu beginn einer arbeit definieren, was man mit den natuerlichen zahlen meint (weil manche die 0 dazu zaehlen, andere nicht). auch da waere es toericht, nur eine der beiden definition als die einzig wahre darzustellen.
joah, sorry, manchmal bekomm ich einen rappel und steiger mich dann so rein. :-)
... und mit dem Kuchenvergleich bist du deutlich übers Ziel hinausgeschossen.
eigentlich nicht, ich habe bloss offenbar meinen punkt nicht deutlich genug klargemacht. ich hoffe, ich konnte das in diesem post nachholen (sorry fuer die redundanz).
prost
seth
Tach!
echte mehrdimensionale Arrays
tja, nun gehen aber die meinungen auseinander, was ein array ist, geschweige denn, was ein "echtes" array ist. klar, in der c-welt ist das noch recht einfach. da gibt's statische arrays und dynamische. in c++ wird's schon schwammiger, denn da bezeichnet man nicht nur die arrays, die's in c schon gab, als arrays, sondern auch hin und wieder z.b. std::vector und aehnliches. wenn man die arrays aus c meint, muss man dagegen deutlich von c-style-arrays sprechen, um nicht ggf. missverstanden zu werden.
Wenn ich das richtig sehe, hat man auch bei einem Vector die gleichen Zugriffsmöglichkeiten wie bei einem Array: fortlaufender lückenloser numerischer Schlüssel, der eine echte Position angibt. Insofern sieht mir der Vector wie ein erweitertes Array aus.
nimmt man das attribut "mehrdimensional" hinzu, wird's nur noch mehrdeutiger. in java wird aehnlich wie in php bei "arrays of arrays" von mehrdimensionalen arrays gesprochen, vgl. Java ist auch eine Insel, 3.8.10 Mehrdimensionale Arrays
Java bezeichnet als Array Gebilde, die ebenfalls einen fortlaufenden lückenlosen numerischen Schlüssel haben. Andere Gebilde haben andere Namen, z.B. HashMap. Mehrdimensionale Arrays oder auch Arrays of Arrays sind dort ebenfalls aus diesen einfachen Strukturen zusammengesetzt. Wenn man aber "assoziative Arrays" - sprich Maps - zusammensetzt, muss man (zumindest ich bemühe mich dann) langsam aber sicher aufhören, beides gleichzusetzen und gleich zu benennen.
Kämest du - ohne PHPs Definition von Array zu betrachten - bei Java auf die Idee, eine verschachtelte Struktur aus HashMaps als mehrdimensionales Array zu bezeichnen? PHP legt mit seinem Ansatz, seine Universalstruktur als Array zu bezeichnen, leider den Grundstein für eine ziemlich starke Verwässerung des Begriffs Array, der anderenorts deutlich spezialisierter verwendet wird. Und ich bleibe dabei, dass es für das Verständnis nicht förderlich ist, das alles als eins zu betrachten.
Es geht mir nicht darum, die richtigen Begriffe nur um ihrer selbst Willen zu verwenden.
worauf ich hinaus will: es gibt haeufig nicht "die richtigen begriffe", so auch in diesem fall.
Das sehe ich anders. Es gibt spezialisierte Begriffe. Ich sehe aber auch, dass sie häufig im PHP-Umfeld unbekannt sind und das allumfassende "Array" leider nicht unbedingt förderlich beim Lösungsfinden ist, ganz besonders nicht, wenn man sämtliche verschachtelte Strukturen lediglich als "mehrdimensionales Array" bezeichnet.
Ich entnehme deinen Ausführungen, dass du gern möchtest, dass der Begriff mehrdimensionales Array - zumindest in der PHP-Welt - für sämtliche verschachtelte PHP-Array-Strukturen "ungestraft" verwendet werden kann. Was bringt es denn aber praktisch für die Lösungsfindung konkreter Probleme, wenn man nicht mehr versuchen sollte, den Blick des Probleminhabers zu schärfen und die Unterschiede zwischen den Strukturen und die besonderen Eigenschaften seines vorliegenden Gebildes aufzuzeigen? Dass eine Mehrheit Dinge so macht, dass es ihr letztlich nicht zum Vorteil gereicht, heißt nicht, dass man damit aufhören sollte oder gar nicht erst anfangen sollte, sich mit Aufklärung zu versuchen.
Wenn jedoch die falsche Verwendung von Begriffen dazu führt,
und auch hier: die verwendung von wolowitz, dem php-manual, dem genannten java-buch usw. ist nicht falsch.
Dann schau nochmal genau hin. Das PHP-Handbuch sagt nicht, dass sämtliche verschachtelte Arrays mehrdimensionale Arrays sind, sondern dass man mit dem Typ "Array" mehrdimensionale Arrays erstellen kann - genauso wie man damit Baumstrukturen erstellen kann. Es definiert nicht, dass ein Baum ein mehrdimensionales Array ist. Und das Java-Buch beschäftigt sich in dem von dir verlinkten Kapitel nur mit "echten" Arrays - da ist die Bezeichnung ja auch völlig akzeptabel und wenig verwirrend. Die anderen Gebilde sind im Kapitel "Datenstrukturen und Algorithmen" getrennt beschrieben. In diesem Kapitel kommt kein Wort vor, dass "dimension" enthält. Dieses Javabuch ist also als Beweis ungeeignet, dass verschachtelte Maps auch außerhalb großer Teile der Welt der PHP-Anwender als mehrdimensionale Arrays bezeichnet werden.
Das heißt nicht, dass du nun auf die Suche nach Beweisen gehen sollst. Das bringt keine Verbesserung in die Angelegenheit.
dass das eigentliche Problem nicht erkannt werden kann, dann ist es meiner Meinung nach nicht förderlich, nicht über den Irrtum aufzuklären.
man haette hier das problem loesen koennen, ohne dem OP vorzuwerfen, einen begriff vermeintlich falsch benutzt zu haben. (er hat ihn naemlich gar nicht falsch benutzt.)
Es gibt immer tausend Möglichkeiten, zu antworten ohne die (vermeintlichen) Probleme hinter einem bestimmten Lösungsansatz oder einer Wortwahl anzusprechen. Das ist aber nicht mein Stil. Ich möchte das auch in Zukunft ansprechen und diskutieren dürfen.
du bist es evtl. gewohnt, den begriff anders zu verwenden. andere sind es aber anders gewohnt. wer hat nun recht? beide, solange sie nicht den jeweils anderen als falschen begriffsverwender darstellen wollen.
Die Frage nach dem Recht stellt sich mir nicht. Du bringst mir in die Sache mehr Drama rein, als ich eigentlich beabsichtigt hatte. Mir geht es - nochmal gesagt - nicht primär um den Begriff, sondern dass man die eigentlich vorhandene Struktur besser erkennt. Der Begriff ist dabei aus meiner Sicht (in manchen Fällen) ein Erkenntnisverhinderer, weswegen ich ihn zumindest zu hinterfragen anregen möchte.
was ich sagen wollte: es ist gar nicht falsch, es schwirren unterschiedliche definitionen rum. solange es keine einheitliche definition dazu gibt, muss man grundsaetzlich alle akzeptieren.
Das ist auch aus logischer Sicht nicht besonders sinnvoll argumentiert. Es besteht kein Muss, alles zu akzeptieren und nichts anzweifeln zu dürfen. Und wenn dieses Muss bestünde, wie sollte man es dann wagen dürfen, eine genaue Definition zu erstellen?
wenn man, wie du oder ich, weiss, dass es versch. definitionen gibt, sieht man meist eh aus dem kontext, was gemeint ist.
Das habe ich auch gesehen. Nur bin nicht ich es, der das Problem verstehen muss, sondern der Probleminhaber. Wenn es ihm hilft, mit besseren Begriffen zur Erkenntnis zu gelangen - und davon bin ich auch im vorliegende Fall erstmal ausgegangen - warum soll ich dann zwingend ("muss") stillschweigend den Aufklärungsversuch unterlassen?
man sollte aber nicht die aus geschmacklichen gruenden praeferierte version als die einzig richtige verkaufen.
Meinen Geschmack hab ich dazu nicht befragt, mein Verstand hat mich zu der gegebenen Antwort bewogen. Und ich sehe keineswegs, dass "mehrdimensionales Array" ein vollkommen und generell inakzeptabler Begriff ist, wenn es um PHP geht. Er wird nur oftmals nicht für das damit bezeichnete Gebilde verwendet - so auch in diesem Fall - das anderenorts andere Namen bekommt.
Man bezeichnet ja die Dinge unterschiedlich, um die Unterschiede deutlich zu machen.
wenn's denn so einfach waere. selbst in der mathematik muss man jedes mal zu beginn einer arbeit definieren, was man [...] meint [...]
Und? Sind Unzulänglichkeiten anderenorts und im eigenen Umfeld ein Grund, nichts für eine Verbesserung zu unternehmen?
dedlfix.
gudn tach!
z.b. std::vector und aehnliches. wenn man die arrays aus c meint, muss man dagegen deutlich von c-style-arrays sprechen, um nicht ggf. missverstanden zu werden.
Wenn ich das richtig sehe, hat man auch bei einem Vector die gleichen Zugriffsmöglichkeiten wie bei einem Array: fortlaufender lückenloser numerischer Schlüssel, der eine echte Position angibt. Insofern sieht mir der Vector wie ein erweitertes Array aus.
so ist es. es gibt jedoch auch unterschiede, sodass pedanten hier durchaus auch sagen koennten, dass ein vector kein array sei (und umgekehrt).
Wenn man aber "assoziative Arrays" - sprich Maps - zusammensetzt, muss man (zumindest ich bemühe mich dann) langsam aber sicher aufhören, beides gleichzusetzen und gleich zu benennen.
wenn man so ein ding als mehrdim. array verwendet (und das nicht unueblich ist), darf man es imho auch so nennen.
Kämest du - ohne PHPs Definition von Array zu betrachten - bei Java auf die Idee, eine verschachtelte Struktur aus HashMaps als mehrdimensionales Array zu bezeichnen?
zugegeben, da es dort den unterschied gibt, wuerde ich wohl tatsaechlich auch solche begriffe wie "nicht echt", "nicht wirklich", "wie ein konventionelles mehrdim. array", ... verwenden.
PHP legt mit seinem Ansatz, seine Universalstruktur als Array zu bezeichnen, leider den Grundstein für eine ziemlich starke Verwässerung des Begriffs Array, der anderenorts deutlich spezialisierter verwendet wird. Und ich bleibe dabei, dass es für das Verständnis nicht förderlich ist, das alles als eins zu betrachten.
was das suchen, um das es ja im OP ging, betrifft, kann man auch bei konventionellen mehrdim. arrays haeufig nicht einen einfachen such-befehl verwenden, sondern kommt um schleifen nicht herum. fuer diese suche ist es sogar fast egal, ob nun map oder array.
hmpf, muss weg. spaeter mehr.
prost
seth
gudn tach!
so, weiter im text...
Ich entnehme deinen Ausführungen, dass du gern möchtest, dass der Begriff mehrdimensionales Array - zumindest in der PHP-Welt - für sämtliche verschachtelte PHP-Array-Strukturen "ungestraft" verwendet werden kann.
der witz bei einem array in php ist, um es in den worten des manuals widerzugeben, dass "it can be treated as" alles moegliche. wenn man ein array als ein mehrdim. array benutzt, dann soll man es auch so nennen duerfen.
Was bringt es denn aber praktisch für die Lösungsfindung konkreter Probleme, wenn man nicht mehr versuchen sollte, den Blick des Probleminhabers zu schärfen und die Unterschiede zwischen den Strukturen und die besonderen Eigenschaften seines vorliegenden Gebildes aufzuzeigen?
diese begriffverwendung zu akzeptieren, schadet in keiner weise einer loesungsfindung. selbst, wenn der OP das ding "huseldusel" genannt haette, haette man aus dem kontext gemerkt, was er meint, und haette erklaeren koennen, wie's geht. in diesem fall waere es dann auch nicht unangebracht, zu sagen, dass man das normalerweise (in der php-welt) nicht "huseldusel" nennt.
der trick war hier nur, die verschachtelte struktur als solche zu erkennen und entsprechend schleifen einzusetzen. bei mehrdim. arrays in C (die in deinen augen diesen namen dann auch verdient haetten) wuerde man da auch nicht um schleifen herumkommen. (unabhaengig von der bezeichnung.)
Dass eine Mehrheit Dinge so macht, dass es ihr letztlich nicht zum Vorteil gereicht, heißt nicht, dass man damit aufhören sollte oder gar nicht erst anfangen sollte, sich mit Aufklärung zu versuchen.
grundsaetzlich zustimmung, aber gerade bei sprache herrscht nun mal ein ziemlich ur-demokratischer zustand. ein einzelner kann da zwar sagen "ich finde diese begriffsverwendung scheisse und sage lieber...", aber der darf sich nicht hinreissen zu sagen "ihr macht das alle falsch!"
Wenn jedoch die falsche Verwendung von Begriffen dazu führt,
und auch hier: die verwendung von wolowitz, dem php-manual, dem genannten java-buch usw. ist nicht falsch.Dann schau nochmal genau hin. Das PHP-Handbuch sagt nicht, dass sämtliche verschachtelte Arrays mehrdimensionale Arrays sind, sondern dass man mit dem Typ "Array" mehrdimensionale Arrays erstellen kann - genauso wie man damit Baumstrukturen erstellen kann.
genau. sehe ich auch so. (siehe oben.)
das Java-Buch beschäftigt sich in dem von dir verlinkten Kapitel nur mit "echten" Arrays - da ist die Bezeichnung ja auch völlig akzeptabel und wenig verwirrend.
das sehen verschiedene leute schon anders. es gibt leute, die bei mehrdim. arrays nur "rechteckige" strukturen (gedanklich) zulassen. darauf wollte ich bei dem java-beispiel hinaus.
Es gibt immer tausend Möglichkeiten, zu antworten ohne die (vermeintlichen) Probleme hinter einem bestimmten Lösungsansatz oder einer Wortwahl anzusprechen. Das ist aber nicht mein Stil. Ich möchte das auch in Zukunft ansprechen und diskutieren dürfen.
ansprechen ist natuerlich immer ok. und der tipp, den du gegeben hast, also "Du musst umdenken und die Struktur als Array of Arrays betrachten. Dann durch das äußere gehen und die inneren Arrays als jeweils eigenständiges Gebilde akzeptieren" war ohne zweifel gold wert.
bloss der anfang, also "Es gibt in PHP so etwas wie mehrdimensionale Arrays im eigentlichen Sinne nicht" ist das, was ich kritisiere, weil der begriff "mehrdimensionales array" einfach unterschiedlich interpretiert wird und man schon deswegen eigentlich nicht mal vom "eigentlichen sinne" sprechen kann.
Die Frage nach dem Recht stellt sich mir nicht. Du bringst mir in die Sache mehr Drama rein, als ich eigentlich beabsichtigt hatte.
ich glaube, das du hiermit ein stueckweit recht hast.
was ich sagen wollte: es ist gar nicht falsch, es schwirren unterschiedliche definitionen rum. solange es keine einheitliche definition dazu gibt, muss man grundsaetzlich alle akzeptieren.
Das ist auch aus logischer Sicht nicht besonders sinnvoll argumentiert.
weiss nicht, was du hier mit "logisch sinnvoll" meinst. meinst du das spocksche "logisch", also "vernuenftig"? dann moechte ich widersprechen. wenn man das kommunizieren, das austauschen von wissen, das problemloesen als das ziel ansieht, dann ist es durchaus sinnvoll, sich auf sein gegenueber einzulassen und nicht metasprachliche diskussionen dort zu fuehren, wo sich eigentlich aus dem kontext der sinn ergibt.
Es besteht kein Muss, alles zu akzeptieren und nichts anzweifeln zu dürfen. Und wenn dieses Muss bestünde, wie sollte man es dann wagen dürfen, eine genaue Definition zu erstellen?
vielleicht denke ich da zu sehr "in wikipedia", aber - um wieder mein beispiel mit den natuerlichen zahlen aufzugreifen - wenn (z.b.) zwei unterschiedliche definitionen im umlauf sind, dann sollte man nicht so egozentrisch sein, nur die eine von einem selbst favorisierte als die richtige anzusehen (aus welchen gruenden auch immer, sei es, weil peano die axiome urspruenglich so oder so formuliert hat), sondern man muss, um vernuenftig zu kommunizieren, akzeptieren, dass es mehrere definitionen gibt. wenn es im kontext relevant ist, ob die null dabei ist oder nicht, sollte man es klaeren, ohne eine der definitionen als "die falsche" zu bezeichnen.
vielleicht wird's am beispiel klarer:
frager: "sind alle natuerlichen zahlen von 0 bis 10 positiv?"
doofer antworter: "0 ist keine natuerliche zahl."
kluger antworter: "die nat. zahlen von 1 bis 9 sind positiv. 0 wird meistens weder als positiv noch als negativ angesehen. [und von einigen wird sie nicht mal als natuerliche zahl angesehen.]"
der satz in klammern ist quasi nur ein gimmick, eine zusatzinfo, eine wie du es nanntest "aufklaerung" die gemacht werden kann oder nicht, aber niemandes sprache herabwuerdigt.
prost
seth
ps: boah, ich liebe firefox! ich dachte, ich haette diese antwort bereits abgeschickt, hatte ich aber gar nicht, sondern es handelte sich bloss um die vorschau. das tab war mittelweile bereits geschlossen. trotzdem war die wiederherstellung kein problem. :-)
Tach!
Mit dem oberen Teil deiner Antwort kommst du nun endlich an dem Punkt an, den ich schon die ganze Zeit vertrete und klar zu machen versuche.
bloss der anfang, also "Es gibt in PHP so etwas wie mehrdimensionale Arrays im eigentlichen Sinne nicht" ist das, was ich kritisiere, weil der begriff "mehrdimensionales array" einfach unterschiedlich interpretiert wird und man schon deswegen eigentlich nicht mal vom "eigentlichen sinne" sprechen kann.
Siehst du diese Abweichung auch außerhalb der PHP-Welt, also dass ein Array von Datensätzen (assoziative Arrays) oder eine Baumstruktur dort ebenfalls mehrdimensionales Array genannt wird? Mir ist das bisher nur bei Alles-ist-ein-Array-PHP aufgefallen.
es ist gar nicht falsch, es schwirren unterschiedliche definitionen rum. solange es keine einheitliche definition dazu gibt, muss man grundsaetzlich alle akzeptieren.
Das ist auch aus logischer Sicht nicht besonders sinnvoll argumentiert.
weiss nicht, was du hier mit "logisch sinnvoll" meinst. meinst du das spocksche "logisch", also "vernuenftig"?
Ich meine die Kausalkette. Wenn ich etwas akzeptieren muss, dann darf ich nicht versuchen, etwas dagegen zu unternehmen, sonst akzeptiere ich das ja nicht. Und dann darf man auch keine andere Definifion zu finden versuchen. Wie soll dann eine Definition entstehen, und wie soll man sich auf diese eine einigen, wenn alles zu akzeptieren sind?
es ist gar nicht falsch,
Der Umkehrschluss, es wäre völlig richtig, ist auch nicht richtig.
dedlfix.
Tach.
der trick war hier nur, die verschachtelte struktur als solche zu erkennen und entsprechend schleifen einzusetzen. bei mehrdim. arrays in C (die in deinen augen diesen namen dann auch verdient haetten) wuerde man da auch nicht um schleifen herumkommen. (unabhaengig von der bezeichnung.)
Doch, gerade in C würde man auch ohne verschachtelte Schleifen auskommen. Ironischerweise macht das die Arrays in C dieser Argumentation nach quasi weniger "mehrdimensional" als die Arrays in PHP, welche dedlfix ja nicht als "mehrdimensional" verstanden wissen möchte.
Ist für die Diskussion aber auch nicht wirklich relevant ...
Tach!
Doch, gerade in C würde man auch ohne verschachtelte Schleifen auskommen.
Aufgrund der Art, wie die Elemente im Speicher abgelegt sind, kann man die Position in C sehr einfach berechnen, ja.
Ironischerweise macht das die Arrays in C dieser Argumentation nach quasi weniger "mehrdimensional" als die Arrays in PHP,
Nö, denn letztlich kommen sämtliche Strukturen in allen Sprachen irgendwie im eindimensionalen Speicher unter. Die Abbildung im Speicher ist kein geeignetes Argument, um über die Strukturen zu sprechen, besonders nicht in Sprachen, wo man nicht mit der Speicherverwaltung in Berührung kommt.
welche dedlfix ja nicht als "mehrdimensional" verstanden wissen möchte.
PHP selbst versteht sie nicht so, sondern sagt nur, dass man damit (unter anderem) mehrdimensionale Arrays abbilden kann. Es sagt nicht, dass alles was irgendwie verschachtelt ist, automatisch ein mehrdimensionales Array sei. Das bezeichen nur Anwender so, die nicht so genau differenzieren (wollen).
dedlfix.
gudn tach!
der trick war hier nur, die verschachtelte struktur als solche zu erkennen und entsprechend schleifen einzusetzen. bei mehrdim. arrays in C (die in deinen augen diesen namen dann auch verdient haetten) wuerde man da auch nicht um schleifen herumkommen. (unabhaengig von der bezeichnung.)
Doch, gerade in C würde man auch ohne verschachtelte Schleifen auskommen.
dem habe ich ja auch nicht wiedersprochen. eine schleife braeuchte man trotzdem (weil's da keine fertige array-suchfunktion gibt). ;-p
Ironischerweise macht das die Arrays in C dieser Argumentation nach quasi weniger "mehrdimensional" als die Arrays in PHP, welche dedlfix ja nicht als "mehrdimensional" verstanden wissen möchte.
ja, das ist ja gerade etwas, auf das ich hinauswill, naemlich dass der begriff "mehrdimensional" in der programmierung gar nicht so eindeutig, geschweige denn intuitiv ist.
prost
seth
joah, sorry, manchmal bekomm ich einen rappel und steiger mich dann so rein. :-)
Mancher versteht halt nicht, dass die Grenze zwischen Hilfe und oberlehrerhafter Belehrung je nach Perspektive eine andere ist.
Fred Furunkelstein
gudn tach!
Mancher versteht halt nicht, dass die Grenze zwischen Hilfe und oberlehrerhafter Belehrung je nach Perspektive eine andere ist.
ja, da kann ich nur zustimmen.
ich finde es jedenfalls sehr schwierig, auf oberlehrerhafte "belehrungen" zu entgegnen, ohne selbst oberlehrerhaft zu wirken. gibt's da'n trick?
prost
seth
ich finde es jedenfalls sehr schwierig, auf oberlehrerhafte "belehrungen" zu entgegnen, ohne selbst oberlehrerhaft zu wirken.
Hast Du doch gesehen:
Den Bezogenen möglichst nicht direkt kritisieren, viel Spielraum lassen, keine Schuldzuweisung.
gibt's da'n trick?
Natürlich kann man jemanden, den man dabei erwischt, wie er morgens Benzin in den Dieselbenz des Chefs tankt, wie folgt ansprechen:
"Oh! Die meisten erzählen mir, mit Benzin würde dieser Wagen nicht funktionieren. Gibt's da'n Trick?"
In England wäre das wohl die höfliche Form. In Deutschland ist das sehr gefährlich.
Schönen guten Tag,
nachdem mich mein Problem die letzten Tage stundenlang beschäftigt hat und ich mit den hier vorgeschlagenen Wegen nicht ganz zurechtgekommen bin, habe ich in meinem "mehrdimensionalen Array" pro "Datensatz" ein weiteres "Feld" hinzugefügt, nämlich nochmal die Nummer selbst. Und mit dem von T-Rex vorgeschlagenen Einsatz von foreach ist das, was ich erreichen will, sehr simpel erledigt. Hier mein neuer und funktionierender Code:
// Das "mehrdimensionale Array" wird definiert:
$user = array();
$user['001']['nummer'] = '001';
$user['001']['name'] = 'Hans-Jürgen';
$user['001']['username'] = 'hanj';
$user['001']['pin'] = '3142';
$user['002']['nummer'] = '002';
$user['002']['name'] = 'Verena';
$user['002']['username'] = 'vere';
$user['002']['pin'] = '9441';
$user['003']['nummer'] = '003';
$user['003']['name'] = 'Ingeborg';
$user['003']['username'] = 'ingb';
$user['003']['pin'] = '9678';
// Der Suchausdruck wird definiert:
$search = 'vere';
// Alle Elemente des Arrays '$user' durchlaufen und nach dem Suchausdruck bei 'username' suchen.
// Wenn es zu einem Treffer kommt, die Nummer des Arrayelements, das gerade im Durchlauf ist, festhalten:
foreach ( $user as $data )
{
if ( $search == $data['username'])
{
$nummer = $data['nummer'];
}
}
Also genau das, was ich haben wollte. Danke T-Rex für den Lösungsansatz. Was die Argumente von dedlfix bezüglich des Terminus "mehrdimensionales Array" betrifft, schließe ich mit seth und Fred Furunkelstein an. Ich persönlich finde es völlig überzogen, hier so ins Detail zu gehen. Der Exkurs mag technisch richtig sein, eine Relevanz für mein Problem hatte er nicht.
Ich habe erst jetzt nach der Lösungsfindung gesehen, dass auch bei dedlfix erster Antwort das Stichwort "foreach" gefallen ist. Das ist halt das Problem, wenn ein technisch sehr versierter Informatiker einem Laien etwas in "techniksprech" erklärt. Jemanden, der hier kein Experte ist, sind Satzkonstrukte wie...
Du musst auf alle Fälle durch das äußere Array laufen und die Unterarrays einzeln betrachten. Iterativ mit foreach und in dessen Body ein Vergleich nebst Abbruch bei Übereinstimmung oder funktional mit array_filter() und selbst geschriebener Vergleichsfunktions.
...nämlich leider keine große Hilfe. Ich kann das lesen, so oft ich will, ich verstehe einfach nicht, was mir das sagen soll und was ich danach tun soll. Dass T-Rex einen PHP Code gepostet hat, war da die viel größere Hilfe. Das im Vergleich mit dem Manual und anderen Seiten hat mir nämlich geholfen, nach 3 Tagen die Sache zu verstehen und mein Problem zu lösen.
Ich bedanke mich bei allen, die sich meinem Posting gewidmet haben!
Mit lieben Grüßen
H. Wolowitz
Om nah hoo pez nyeetz, Wolowitz!
$user['001']['nummer'] = '001';
Dass du hierbei
- Daten sinnloserweise doppelt speicherst
- (möglicherweise) eine zusätzliche Felerquelle hast (Vertipper)
sollte dir nicht einerlei sein.
Ich habe erst jetzt nach der Lösungsfindung gesehen, dass auch bei dedlfix erster Antwort das Stichwort "foreach" gefallen ist. Das ist halt das Problem, wenn ein technisch sehr versierter Informatiker einem Laien etwas in "techniksprech" erklärt. Jemanden, der hier kein Experte ist, sind Satzkonstrukte wie...
Deine Postings machen auf mich nicht den Eindruck, dass du ein völliger Laie bist.
Du musst auf alle Fälle durch das äußere Array laufen und die Unterarrays einzeln betrachten. Iterativ mit foreach und in dessen Body ein Vergleich nebst Abbruch bei Übereinstimmung oder funktional mit array_filter() und selbst geschriebener Vergleichsfunktions.
...nämlich leider keine große Hilfe. Ich kann das lesen, so oft ich will, ich verstehe einfach nicht, was mir das sagen soll und was ich danach tun soll. Dass T-Rex einen PHP Code gepostet hat, war da die viel größere Hilfe.
Dann musst du fragen: Was bedeutet "Du musst auf alle Fälle durch das äußere Array laufen und die Unterarrays einzeln betrachten."
Das im Vergleich mit dem Manual und anderen Seiten hat mir nämlich geholfen, nach 3 Tagen die Sache zu verstehen und mein Problem zu lösen.
Es gibt bessere Lösungen.
Matthias
Ich würde das universeller gestalten und in eine Funktion kapseln wollen.
Vorteile:
<?php
// Testdaten
$user = array();
$user['001']['nummer'] = '001';
$user['001']['name'] = 'Hans-Jürgen';
$user['001']['username'] = 'hanj';
$user['001']['pin'] = '3142';
$user['002']['nummer'] = '002';
$user['002']['name'] = 'Verena';
$user['002']['username'] = 'vere';
$user['002']['pin'] = '9441';
$user['003']['nummer'] = '003';
$user['003']['name'] = 'Ingeborg';
$user['003']['username'] = 'ingb';
$user['003']['pin'] = '9678';
// Aufruf mit IsInArray($search, $haystack);
if (IsInArray('vere', $user)) { // Funktionsaufruf
print "gefunden\n";
} else {
print "NICHT gefunden\n";
}
// als Funktion gekapselt
function IsInArray($search, $haystack) {
$bol=false;
foreach (array_keys($haystack) as $k) {
if (is_array($haystack[$k])) { // wenn array, dann:
$bol=IsInArray($search, $haystack[$k]); // rekursiver Funktionsaufruf
} elseif ( $haystack[$k] == $search ) {
$bol=true;
}
if ($bol) { return $bol; }
}
return false;
}
?>
Tach!
<del>Disclaimer: Dies stellt selbstverständlich keine Kritik am Vorposter dar, denn die mag er nicht besonders. Folgendes ist nur so fürs Archiv dahergesagt.</del>
Ich würde das universeller gestalten und in eine Funktion kapseln wollen.
Die Aufgabe war nicht, nur herauszufinden ob ein Wert irgendwo in einem beliebig tief verschachtelten Array enthalten ist, sondern konkret in einem speziellen Key eines Unterarrays nachzuschauen und bei Übereinstimmung den zu diesem Unterarray gehörenden Key des Hauptarrays zurückzuliefern. Die vorliegende Lösung geht also so ziemlich am Thema vorbei.
- geht für arrays mit beliebiger verschachtelung (oder 'Dimensionen' - den Begriff gebrauche ich auch um es Anfängern anschaulich zu machen)
Anschaulicher im eigentlichen Wortsinne finde ich, das Augenmerk auf die Stuktur zu lenken, wie sie wirklich ist, und nicht ihr nur einfach einen unpassenden aber weit fehlgebrauchten Begriff zu verpassen. Anschaulicher wäre für mich beispielsweise auf eine print_r()-Ausgabe hinzuweisen, in der man die einzelnen Arrays zu sehen bekommt, mit denen man für eine Aufgabenlösung arbeiten muss.
Der folgende Code kann zumindest verwendet werden, um das "ob" zu ermitteln, wenn das "wo" und andere Details unwichtig sind.
// als Funktion gekapselt
function IsInArray($search, $haystack) {
$bol=false;
foreach (array_keys($haystack) as $k) {
if (is_array($haystack[$k])) { // wenn array, dann:
$bol=IsInArray($search, $haystack[$k]); // rekursiver Funktionsaufruf
} elseif ( $haystack[$k] == $search ) {
$bol=true;
}
if ($bol) { return $bol; }
}
return false;
}
array\_keys() läuft einmal durch das Array durch und sammelt alle Schlüssel ein. foreach(array\_keys()...) läuft nun durch dieses Key-Array durch. $haystack[$k] läuft wieder durch das erste Array durch, zumindest bis das zum Key $k gehörende Element gefunden wurde. Das dann aber dreimal. Durch die Rekursion wird das Ganze nicht besser.
foreach ($haystack as $v) und im weiteren Verlauf $v zu verwenden, erledigt die Aufgabe bei nur einem Durchlauf. Und $bol kann man auch noch rauskürzen.
~~~php
function IsInArray($search, $haystack) {
foreach ($haystack as $v) {
if (is_array($v) and IsInArray($search, $v)) {
return true;
} elseif ($v == $search) {
return true; // sofortiges Ende, wenn gefunden
}
}
return false;
}
dedlfix.
// Das "mehrdimensionale Array" wird definiert:
$user = array();
$user['001']['nummer'] = '001';
$user['001']['name'] = 'Hans-Jürgen';
$user['001']['username'] = 'hanj';
$user['001']['pin'] = '3142';/* .. */
// Der Suchausdruck wird definiert:
$search = 'vere';
// Alle Elemente des Arrays '$user' durchlaufen und nach dem Suchausdruck bei 'username' suchen.
// Wenn es zu einem Treffer kommt, die Nummer des Arrayelements, das gerade im Durchlauf ist, festhalten:foreach ( $user as $data )
{
if ( $search == $data['username'])
{
$nummer = $data['nummer'];
}
}
> [...] nach 3 Tagen die Sache zu verstehen und mein Problem zu lösen.
Meiner Meinung nach hast du dein Problem nicht gelöst sondern umgangen. `$user['003']['nummer'] = '003';`{:.language-php} redundante Daten, auf die du mit der erweiterten Variante von foreach viel leichter drauf zugreifen kannst.
> Beim Herumprobieren mit der. 2. Form des foreach bin ich in den letzten Tagen leider nicht weitergekommen. ([Quelle](https://forum.selfhtml.org/?t=212940&m=1455522))
Was genau hast du denn probiert?
~~~php
$arr = Array("index1"=>"xx","index2"=>"yy");
foreach($arr as $key => $value){
echo $key," => ",$value,"\n";
}
Gibt folgendes aus:
index1 => xx
index2 => yy
An diesem Punkt kommt ins Spiel, dass du ein Array of Array hast. Quasi besteht $value aus deinem inneren Array, das die Indizi..Inde... (Plural von Index) 'name', 'user' & 'pin' hat.
foreach($user as $key => $value){
echo $key," => ",$value['user'],'\n';
}
Wenn man dein hardcoded Array komplett mit dem Arrray-Konstruktor erzeugen würde wäre auch klar, das $user ein Array of Array ist.
$user = Array(
"001" => Array(
"user" => "bla",
"name"=>"bla2"
"pin"=> 12356
),
"002" => Array(
"user" => "blub",
"name"=>"blub2"
"pin"=> 654321
)
);
MfG
bubble
hi,
Ich bedanke mich bei allen, die sich meinem Posting gewidmet haben!
hab erst heute Zeit gefunden, sorry. Vielleicht noch einen allgemeinen Tipp aus meiner Praxis zu komplexeren Datenstrukturen, i.d.R. array's in denen auf einen Key mehrere Attribute liegen. Du tust gut daran, den key selbst nocheinmal in der Attribute-Liste zu haben, z.B. so:
'365' = > array(
'keyname' => '365',
'preis' => 35.79,
)
Tückisch nicht türkisch ist array_slice(), das nagelt Dir mit FALSE im 2. Argument Deine Schlüssel weg (wenn Deine Schlüssel numerisch sind) und ersetzt diese durch fortlaufende Nummern. Wenn Du also Deinen keyname in der PropertyListe hast, kannst Du das Original wieder herstellen.
Horst Preller
Schönen guten Tag Horst,
Vielleicht noch einen allgemeinen Tipp aus meiner Praxis zu komplexeren Datenstrukturen, i.d.R. array's in denen auf einen Key mehrere Attribute liegen. Du tust gut daran, den key selbst nocheinmal in der Attribute-Liste zu haben, z.B. so:
'365' = > array(
'keyname' => '365',
'preis' => 35.79,
)
das widerspricht aber der Meinung von Matthias Apsel und bubble, die die doppelte Angabe kritisiert haben. Letzteres habe ich auch nachvollziehen können und mich zu Gunsten der von dedlfix und T-Rex vorgegebenen Lösung entschieden.
Mit lieben Grüßen
H. Wolowitz
--
![](http://webstuff.at-web.cc/pub/selfhtml/profile/wolowitz.png)
Gut, dann können wir die Zettel von den Laternen nehmen...
Hallo,
das widerspricht aber der Meinung von Matthias Apsel und bubble, die die doppelte Angabe kritisiert haben. Letzteres habe ich auch nachvollziehen können und mich zu Gunsten der von dedlfix und T-Rex vorgegebenen Lösung entschieden.
ja, hotti liebt's umständlich und kompliziert. Wenn der einen Film-Bösewicht spielen sollte, würde er seine Gegner vermutlich auch mit einem vergifteten Strick erschießen.
Ciao,
Martin
ja, hotti liebt's umständlich und kompliziert. Wenn der einen Film-Bösewicht spielen sollte, würde er seine Gegner vermutlich auch mit einem vergifteten Strick erschießen.
Aber nicht ohne zuvor ein 300-Zeilen-Framework a) um den Gegner, b) um den Strick und c) um das Gift herum zu bauen, damit er das Erschießen selbst bequem und einfach mit einem Einzeiler erledigen kann.
Fred
Tach!
Vielleicht noch einen allgemeinen Tipp aus meiner Praxis zu komplexeren Datenstrukturen, i.d.R. array's in denen auf einen Key mehrere Attribute liegen. Du tust gut daran, den key selbst nocheinmal in der Attribute-Liste zu haben, z.B. so:
'365' = > array(
'keyname' => '365',
'preis' => 35.79,
)
>
> das widerspricht aber der Meinung von Matthias Apsel und bubble, die die doppelte Angabe kritisiert haben.
Ganz verkehrt ist die Sache nicht. Es kommt drauf an, wofür diese Nummer steht - und wie du deine Daten verarbeitest. Wenn sie Bestandteil der Userdaten ist und du diese Userdaten-Arrays auch einzeln verarbeitest oder irgendwohin (an eine Funktion) übergibst, dann wäre diese Nummer als ein Feld davon vermutlich sinnvoll. Wenn sie zum Beispiel einfach nur die Position in einer Liste angibt, dann ist sie kein Userdatenbestandteil und somit darin entbehrlich oder gar überflüssig. Sie (wenn sie zu den Userdaten gehört) an beiden Stellen zu haben, kann ebenso sinnvoll sein, weil damit zum einen die Userdaten vollständig sind und zum anderen über diese Nummer als Key direkt auf einen User zugegriffen werden kann.
Manche Sachen kann man erst dann richtig(er) einschätzen, wenn man das Umfeld genauer kennt. Wenn du zum Beispiel statt der Nummer den Usernamen als Key nehmen würdest (angenommen, das passt zu deiner Aufgabenstellung) dann wäre die Angelegenheit schon deutlicher. Der Username ist eindeutig Bestandteil der Userdaten und gehört als Feld in das Datensatz-Array. Zum schnelleren Zugriff auf einen bestimmten User ist er zusätzlich als Key verwendet ebenfalls wertvoll. Um die Existenz eines Usernamens festzustellen braucht es dann zum Beispiel nämlich nur noch isset($users[$username]).
dedlfix.
hi,
das widerspricht aber der Meinung von Matthias Apsel und bubble, die die doppelte Angabe kritisiert haben.
Widersprüche sind Triebkräfte der Entwicklung. Diese Feststellung von Marx/Engels im "Dialektischen Materialismus" kann ich als Praktikter mit mehr als 10 Jahren Programmiererfahrung voll und ganz bestätigen:
Marx ist die Theorie, Murx ist die Praxis ;)
Hotti