funktion count und mehrdimensionale Arrays
Martin Rozmus
- php
Abend zur später Stunde,
Mein Anliegen: Ich habe ein drei dimensionales Array. Vorab versuche ich es in einer Grafik darzustellen und hinterher werde ich ein paar Worte dazu verlieren:
|-Arr[0][0]
|-Arr[0][1]
|-Arr[0]-|-Arr[0][2]
| |-Arr[0][3]
Arr--| |-Arr[0][4]
|
|
| |-Arr[1][0]
|-Arr[1]-|
|-Arr[1][1]
So, nun versuche ich das in Worte zu fassen. Wer mein Diagramm verstanden hat, kann den Absatz überspringen: In der ersten Dimension des Arrays sind zwei zweisimensionale Arrays gespeichert. In dem ersten zweidimensionalen Array[0] sind fünf und in dem zweiten Array[1] zwei eindimensionale Arrays gespeichert (Arr[x][y]).
--->PROBLEM: wenn ich die Anzahl der Elemente in Arr[0] mit der funktion count(Arr[0]) aufrufe, liefert sie mir hier den richtigen Wert von 5.
Dagegen liefert count(Arr[1]) den Wert 7, ergo die Summe aus count(Arr[0]) und count(Arr[1]).
Müsste aber das Ergebnis für count(Arr[1]) nicht 2 Lauten? In Arr[1] sind schließlich nur zwei Weitere Elemente vorhanden.
Hat jemand einen Ansatz dafür, wie ich die Anzahl der Elemente in Arr[1] nicht als Summe aus Arr[x] erhalte?
Für die Denkansträngung um diese Uhrzeit entschuldige ich mich jetzt schon und hoffe auf Anregungen.
Gruss Martin
hallo Martin,
Mein Anliegen: Ich habe ein drei dimensionales Array. Vorab versuche ich es in einer Grafik darzustellen
Das hilft nicht viel. Du weißt, daß du es hier vor allem mit Leuten zu tun hast, die auch teilweise sehr komplexe Codezeilen lesen können und/oder täglich erstellen. Wenn du grafische Darstellungen zur Verdeutlichung eines Problems hier demonstieren willst, sollte das in Form eines Screenshots geschehen - naja, geht wohl im Moment bei dir noch nicht.
In der ersten Dimension des Arrays sind zwei zweisimensionale Arrays gespeichert. In dem ersten zweidimensionalen Array[0] sind fünf und in dem zweiten Array[1] zwei eindimensionale Arrays gespeichert (Arr[x][y]).
Ja, sowas gibts, das kann man machen ... aber wo ist dein Code dazu, um nachzuschauen, ob dein Code auch exakt dasselbe macht wie deine verbale Beschreibung?
--->PROBLEM: wenn ich die Anzahl der Elemente in Arr[0] mit der funktion count(Arr[0]) aufrufe, liefert sie mir hier den richtigen Wert von 5.
Nett.
Dagegen liefert count(Arr[1]) den Wert 7, ergo die Summe aus count(Arr[0]) und count(Arr[1]).
Weniger nett. Aber ohne Kenntnis des zugrundegelegten Codes nicht verifizierbar.
Für die Denkansträngung um diese Uhrzeit entschuldige ich mich jetzt schon und hoffe auf Anregungen.
Naja, so sehr "sträng" wars ja noch nicht. Das wirds erst, wenn man sich tatsächlich anhand deines Scripts anschauen kann, wo eventuell der Fehler liegt.
Grüße aus Berlin
Christoph S.
Hallo Christoph,
hier ist ein Ausschnitt aus dem Code:
$arr=person_suchen($_REQUEST['suchwert']);
.....
<ul>
<?
$arr_suchwert=split('[#]',$_REQUEST['suchwert']);
$i=0;
for ($n=0;$n<count($arr);$n++){
?>
<p>Die Suche nach <b><? echo $arr_suchwert[$n] ?></b> ergab <b><? echo count($arr[$n]) ?></b> Suchergebnisse
^^^^^^^^^^^^^^ hier steckt der Teufel
für das Formular <b><? echo $zeile[0] ?></b></p>
<?
for($i;$i<count($arr[$n]);$i++){
?>
<li>
<a href="../haupt/eingabe.php?incl=<? echo urlencode($_REQUEST['ziel']) ?>&lfd=<? echo $arr[$n][$i][0] ?>">
<? echo $arr[$n][$i][0].", ".$arr[$n][$i][1].", ".$arr[$n][$i][2].
", ".datum_us2eu($arr[$n][$i][3]).", ".$arr[$n][$i][4] ?>
</a>
</li>
<?
}
}
?>
</ul>
Etwas zu Hintergrund: In ein einzeiliges Textfeld kann man Name [Vorname][Geburtsdatum] mehrerer Personen eingeben, um nach ihnen in einer DB zu suchen. Die Personen werden mit # getrennt, die Werte in [] sind optional.
Die Funktion hierfür:
function person_suchen($such_arr){
$big_arr = split('[#]',$such_arr);
$i=0;
for($n=0;$n<count($big_arr);$n++){
$arr = split('[,. ;]',$big_arr[$n],3);
if (count($arr)==1){
$sql=
"SELECT...WHERE... AND personen.nachname LIKE '".$arr[0]'
";
}
elseif(count($arr)==2){
$sql=
"SELECT...Where...AND personen.nachname LIKE '".$arr[0]' AND personen.vorname LIKE '".$arr[1]."'
";
}
elseif(count($arr)==3){
$sql=
"SELECT ...
WHERE ...
AND personen.nachname LIKE '".$arr[0]."'
AND personen.vorname LIKE '".$arr[1]."'
AND personen.geburtstag LIKE '".datum_eu2us($arr[2])."'
";
}
if (isset($sql)){
$db = mySQL_ini();
$result = mysql_query($sql,$db);
While ($zeile= mysql_fetch_row($result)){
$erg_arr[$i]=$zeile;
$i++;
}
}
$big_erg_arr[$n]=$erg_arr;
}
if(count($big_erg_arr)==0){
return false;
}
else
{
return $big_erg_arr;
}
}
Vielen Dank schon,
Gruss aus Göttingen
Martin
auweia ...
jetzt hab ich die Initiativstrafe an der Backe und darf als erster mal so tun, als ob ich was Gescheites als Lösung wüßte ...
hier ist ein Ausschnitt aus dem Code:
Ja, danke, wollte ich ja richtigerweise so haben. :-(
<p>Die Suche nach <b><? echo $arr_suchwert[$n] ?></b> ergab <b><? echo count($arr[$n]) ?></b> Suchergebnisse
^^^^^^^^^^^^^^ hier steckt der Teufel
zur Teufelsaustreibung würde ich empfehlen, die Variable n zu deklarieren - jaja, ich weiß, daß PHP das nicht zwingend braucht. Aber probieren kann mans ja mal, wenns klappt, isses gut, wenns nicht klappt - naja, dann gibts halt noch das SELFHTML-Forum.
für das Formular <b><? echo $zeile[0] ?></b></p>
<?
for($i;$i<count($arr[$n]);$i++){
?>
_Das_ sieht irgendwie nicht so gut aus, wenn du dir mal die Form deiner Klammern anschaust. Hier ist _innerhalb_ von <? ... ?> eine geschweifte Klammer geöffnet, aber nicht wieder geschlossen und übrigens auch eine spitze Klammer nicht ...
Grüße aus Berlin
Christoph S.
<p>Die Suche nach <b><? echo $arr_suchwert[$n] ?></b> ergab <b><? echo count($arr[$n]) ?></b> Suchergebnisse
^^^^^^^^^^^^^^ hier steckt der Teufel
zur Teufelsaustreibung würde ich empfehlen, die Variable n zu deklarieren - jaja, ich weiß, daß PHP das nicht zwingend braucht. Aber probieren kann mans ja mal, wenns klappt, isses gut, wenns nicht klappt - naja, dann gibts halt noch das SELFHTML-Forum.
Ist die Variable nicht schon mit:
for ($n=0;$n<count($arr);$n++)
^^^ deklariert?
Ich habe eben versucht, sie oben zu deklarieren, also::
$n=0;
...
for($n;$n<count($arr);$n++)
hat nichts gebracht.
für das Formular <b><? echo $zeile[0] ?></b></p>
<?
for($i;$i<count($arr[$n]);$i++){
?>
_Das_ sieht irgendwie nicht so gut aus, wenn du dir mal die Form deiner Klammern anschaust. Hier ist _innerhalb_ von <? ... ?> eine geschweifte Klammer geöffnet, aber nicht wieder geschlossen und übrigens auch eine spitze Klammer nicht ...
Die Klammern stimmen schon. Ich habe es aus dem Editor rauskopiert, anscheinend für den Fall nicht komplett. Es ergeben sich keine Fehelermeldungen seitens php. Die Suchergebnisse werden auch richtig dargestellt. Nur die Zählung der Arrays im Array ist nicht so, wie ich mir das logisch vorstellen würde.
Übrigens, zu deinem Beitrag [pref:t=50853&m=278843] habe ich ein passendes Zitat gefunden: "Es ist nett, wichtig zu sein, aber ist wichtiger, nett zu sein." ;-)
Gruss Martin
Hallo Martin,
mach mal bitte der reinen Fehlersuche ein var_dump( $arr ), ob denn wirklich drin steht, was du vermutest.
Hallo Thoralf,
mach mal bitte der reinen Fehlersuche ein var_dump( $arr ), ob denn wirklich drin steht, was du vermutest.
Ich glaube das ist es. Habe gerade nach zwei Personen gesucht. Die Suche sollte zwei Suchergebnisse liefern. Das Array beinhaltet aber drei Ergebnisse, davon zwei identische. Hier das Ergebnis von dump_var($arr); Beachte, Mustermann ist nur einmal in der DB vorhanden.
array(2) {
[0]=> array(1) {
[0]=> array(6) {
[0]=> string(2) "16"
[1]=> string(10) "Mustermann"
[2]=> string(5) "Peter"
[3]=> string(10) "1980-01-01"
[4]=> string(4) "Gast" [5]=> string(6) "gono16"
}
}
[1]=> array(2) {
[0]=> array(6) {
[0]=> string(2) "16"
[1]=> string(10) "Mustermann"
[2]=> string(5) "Peter"
[3]=> string(10) "1980-01-01"
[4]=> string(4) "Gast"
[5]=> string(6) "gono16"
}
[1]=> array(6) {
[0]=> string(2) "15"
[1]=> string(8) "Testmann"
[2]=> string(4) "Test"
[3]=> string(10) "0000-00-00"
[4]=> string(4) "Gast"
[5]=> string(6) "gono15"
}
}
}
Nun muss ich herausfinden, ob die Funktion person_suchen() oder die Schleife(n), die die Ergebnisse der Funktion verarbeiten fehlerhaft sind :-|
Danke für den Tipp,
Gruss Martin
Hallo,
teil uns doch mal Dein SELECT-Statement mit.
Vielleicht hilft ein DISTINCT ?
Grüße
Chris (C)
Hallo Chris,
teil uns doch mal Dein SELECT-Statement mit.
daran liegt es nicht. Es ist jeweils nur ein "Testmann" und ein "Mustermann" in der DB vorhanden. Aber, hier die SQL Queries:
if (count($arr)==1){
$sql=
"SELECT personen.lfd, personen.nachname,personen.vorname,
personen.geburtstag, personengruppe.gruppe, personen.kennung
FROM personen,personengruppe,chron_personengruppe
WHERE personen.nachname LIKE '".$arr[0]."'
AND (chron_personengruppe.fk_personen=personen.lfd
AND personengruppe.lfd = chron_personengruppe.fk_personengruppe
AND ISNULL(chron_personengruppe.bis))
";
}
elseif(count($arr)==2){
$sql=
"SELECT personen.lfd, personen.nachname,personen.vorname,
personen.geburtstag, personengruppe.gruppe, personen.kennung
FROM personen,personengruppe,chron_personengruppe
WHERE chron_personengruppe.fk_personen=personen.lfd
AND personengruppe.lfd = chron_personengruppe.fk_personengruppe
AND ISNULL(chron_personengruppe.bis)
AND personen.nachname LIKE '".$arr[0]."'
AND personen.vorname LIKE '".$arr[1]."'
";
}
elseif(count($arr)==3){
$sql=
"SELECT personen.lfd, personen.nachname,personen.vorname,
personen.geburtstag, personengruppe.gruppe, personen.kennung
FROM personen,personengruppe,chron_personengruppe
WHERE chron_personengruppe.fk_personen=personen.lfd
AND personengruppe.lfd = chron_personengruppe.fk_personengruppe
AND ISNULL(chron_personengruppe.bis)
AND personen.nachname LIKE '".$arr[0]."'
AND personen.vorname LIKE '".$arr[1]."'
AND personen.geburtstag LIKE '".datum_eu2us($arr[2])."'
";
}
Gruss Martin
Hallo alle Interessierten,
ich habe den Fehler Gefunden! Es fehlte ein einfaches unset!!! Kucken:
function person_suchen($such_arr){
$big_arr = split('[#]',$such_arr);
for($n=0;$n<count($big_arr);$n++){
$arr = split('[,. ;]',$big_arr[$n],3);
if (count($arr)==1){
$sql=
"SELECT personen.lfd, personen.nachname,personen.vorname,
personen.geburtstag, personengruppe.gruppe, personen.kennung
FROM personen,personengruppe,chron_personengruppe
WHERE personen.nachname LIKE '".$arr[0]."'
AND (chron_personengruppe.fk_personen=personen.lfd
AND personengruppe.lfd = chron_personengruppe.fk_personengruppe
AND ISNULL(chron_personengruppe.bis))
";
}
elseif(count($arr)==2){
$sql=
"SELECT personen.lfd, personen.nachname,personen.vorname,
personen.geburtstag, personengruppe.gruppe, personen.kennung
FROM personen,personengruppe,chron_personengruppe
WHERE chron_personengruppe.fk_personen=personen.lfd
AND personengruppe.lfd = chron_personengruppe.fk_personengruppe
AND ISNULL(chron_personengruppe.bis)
AND personen.nachname LIKE '".$arr[0]."'
AND personen.vorname LIKE '".$arr[1]."'
";
}
elseif(count($arr)==3){
$sql=
"SELECT personen.lfd, personen.nachname,personen.vorname,
personen.geburtstag, personengruppe.gruppe, personen.kennung
FROM personen,personengruppe,chron_personengruppe
WHERE chron_personengruppe.fk_personen=personen.lfd
AND personengruppe.lfd = chron_personengruppe.fk_personengruppe
AND ISNULL(chron_personengruppe.bis)
AND personen.nachname LIKE '".$arr[0]."'
AND personen.vorname LIKE '".$arr[1]."'
AND personen.geburtstag LIKE '".datum_eu2us($arr[2])."'
";
}
if (isset($sql)){
$db = mySQL_ini();
$result = mysql_query($sql,$db);
$i=0;
While ($zeile= mysql_fetch_row($result)){
$erg_arr[$i]=$zeile;
$i++;
}
$big_erg_arr[$n]=$erg_arr;
unset($erg_arr);
^^^^^^^^^^^^^^^^
::::::::::::::::::::::::::::::::::::::::::::::::::::::
WENN DIE SUCHE NACH DEM ERSTEN NAMEN Z.B. 3 ERGEBNISSE LIEFERTE UND DIE SUCHE NACH DEM ZWEITEN NUR 1 ERGEBNIS; SO WAR DAS (DER?) $erg_arr ARRAY BEIM DURCHGANG DER ZWEITEN SCHLEIFE IN DEN FELDERN [1][2] MIT DEN WERTEN AUS DEM ERSTEN DURCHGANG DER SCHLEIFE BESETZT. LEDIGLICH WURDE DAS FELD [0] MIT DEM NEUEN SUCHERGEBNIS ÜBERSCHRIEBEN
:::::::::::::::::::::::::::::::::::::::::::::::::::::
}
}
if(count($big_erg_arr)==0){
return false;
}
else
{
return $big_erg_arr;
}
}
Manchmal ist die Lösung so einfach. Danke für eure Hilfe. Vor allem der Tip mit var_dump() hat mich weiter gebracht.
Schönes Wochenende
Gruss Martin
Nun muss ich herausfinden, ob die Funktion person_suchen() oder die Schleife(n), die die Ergebnisse der Funktion verarbeiten fehlerhaft sind :-|
Ich bin ein Stück weiter: Es liegt an der Funktion person_suchen().
Ich habe den Code etwas modifiziert, um die Ausgaben zu verfolgen:
function person_suchen($such_arr){
$big_arr = split('[#]',$such_arr);
$x=0;
echo "BIGARR : ".count($big_arr)."\n\r________________________________________\n\r\n";
for($n=0;$n<count($big_arr);$n++){
$arr = split('[,. ;]',$big_arr[$n],3);
//echo $arr[0]."Arr0 Scleif: ".$n."";
if (count($arr)==1){
$sql=
"SELECT personen.lfd, personen.nachname,personen.vorname,
personen.geburtstag, personengruppe.gruppe, personen.kennung
FROM personen,personengruppe,chron_personengruppe
WHERE personen.nachname LIKE '".$arr[0]."'
AND (chron_personengruppe.fk_personen=personen.lfd
AND personengruppe.lfd = chron_personengruppe.fk_personengruppe
AND ISNULL(chron_personengruppe.bis))
";
}
elseif(count($arr)==2){
$sql=
"SELECT personen.lfd, personen.nachname,personen.vorname,
personen.geburtstag, personengruppe.gruppe, personen.kennung
FROM personen,personengruppe,chron_personengruppe
WHERE chron_personengruppe.fk_personen=personen.lfd
AND personengruppe.lfd = chron_personengruppe.fk_personengruppe
AND ISNULL(chron_personengruppe.bis)
AND personen.nachname LIKE '".$arr[0]."'
AND personen.vorname LIKE '".$arr[1]."'
";
}
elseif(count($arr)==3){
$sql=
"SELECT personen.lfd, personen.nachname,personen.vorname,
personen.geburtstag, personengruppe.gruppe, personen.kennung
FROM personen,personengruppe,chron_personengruppe
WHERE chron_personengruppe.fk_personen=personen.lfd
AND personengruppe.lfd = chron_personengruppe.fk_personengruppe
AND ISNULL(chron_personengruppe.bis)
AND personen.nachname LIKE '".$arr[0]."'
AND personen.vorname LIKE '".$arr[1]."'
AND personen.geburtstag LIKE '".datum_eu2us($arr[2])."'
";
}
if (isset($sql)){
$db = mySQL_ini();
$result = mysql_query($sql,$db);
$i=0;
While ($zeile= mysql_fetch_row($result)){
echo "Ergebnisse bei durchgagn ".$n."Schleife ".$i." ".$zeile[5]."\n\r".
$erg_arr[$i]=$zeile;
$i++;
$x++;
}
$big_erg_arr[$n]=$erg_arr;
echo "Zeilen bei durchgagn ".$n." :".count($erg_arr)."\n\r".
" zu suchen: ".$arr[0]."\n\r".
"SQL: ".$sql."\n\r -->BIGarr .".$n."& ".$i.": ".$big_erg_arr[$n][$i][5]."\n\r------------\n\r";
}
}
echo "while: ".$x."\n\n\n\r";
if(count($big_erg_arr)==0){
return false;
}
else
{
//echo $big_erg_arr[1][0][2];
return $big_erg_arr;
}
}
person_suchen("ro%#testmann");
Die Ausgabe sieht folgender Maßen aus:
BIGARR : 2
________________________________________
Ergebnisse bei durchgagn 0Schleife 0 gono2
ArrayErgebnisse bei durchgagn 0Schleife 1 gono8
ArrayErgebnisse bei durchgagn 0Schleife 2 gono9
ArrayErgebnisse bei durchgagn 0Schleife 3 gono11
ArrayErgebnisse bei durchgagn 0Schleife 4 gono12
ArrayErgebnisse bei durchgagn 0Schleife 5 gono13
ArrayErgebnisse bei durchgagn 0Schleife 6 gono14
ArrayZeilen bei durchgagn 0 :7
zu suchen: ro%
SQL: SELECT personen.lfd, personen.nachname,personen.vorname,
personen.geburtstag, personengruppe.gruppe, personen.kennung
FROM personen,personengruppe,chron_personengruppe
WHERE personen.nachname LIKE 'ro%'
AND (chron_personengruppe.fk_personen=personen.lfd
AND personengruppe.lfd = chron_personengruppe.fk_personengruppe
AND ISNULL(chron_personengruppe.bis))
-->BIGarr .0& 7:
------------
MERKWÜRDIG IST; DASS BEI DER SCHLEIFE n=1 NUR EIN ERGEBNIS ZURÜCKGEGEBEN WIRD, DIE WHILE SCHLEIFE ABER DENNOCH 7 MAL DURCHLAUFEN WIRD. WEITERHIN IST AUFFÄLLIG, DASS DIE ANZAHL DER WHILE DURCHLÄUFE BEIM DURCHGANG n=1 IDENTISCH IST MIT DER ANZAHL DER DURCHLÄUFE BEIM DURCHGANG n=0. PERSONEN MIT DEM ANFANG DES NACHNAMENS ro% SIND AUCH TATSÄCHLICH 7 MAL IN DER DB VORHANDEN. PERSONEN MIT NACHNAME testmann SIND ABER NUR 1 MAL IN DER DB VORHANDEN.
::::::::::::::::::::::::::::::::::::::::
Ergebnisse bei durchgagn 1Schleife 0 gono15
ArrayZeilen bei durchgagn 1 :7
zu suchen: testmann
::::::::::::::::::::::::::::::::::::::::::::
SQL: SELECT personen.lfd, personen.nachname,personen.vorname,
personen.geburtstag, personengruppe.gruppe, personen.kennung
FROM personen,personengruppe,chron_personengruppe
WHERE personen.nachname LIKE 'testmann'
AND (chron_personengruppe.fk_personen=personen.lfd
AND personengruppe.lfd = chron_personengruppe.fk_personengruppe
AND ISNULL(chron_personengruppe.bis))
-->BIGarr .1& 1: gono8
------------
while: 8