zählen wie oft element in array vorkommt
azok
- php
0 wahsaga0 Hilfe...
azok
hi!
ich weiß, dass ist vielleicht eine blöde/triviale frage, aber ich finde nichts dazu (bzw. weiß nicht, wie ich suchen soll). und zwar, ob es in php eine vordefinierte funktion gibt, die zählt, wie oft ein element in einem array vorhanden ist, oder ob man sich dazu selbst eine schreiben müsste... (über schleifen etc.)
lg
azok
hi,
ich weiß, dass ist vielleicht eine blöde/triviale frage, aber ich finde nichts dazu (bzw. weiß nicht, wie ich suchen soll). und zwar, ob es in php eine vordefinierte funktion gibt, die zählt, wie oft ein element in einem array vorhanden ist
dann nimmt man sich mal die übersichtsseite über die array-funktionen, und schaut da nach, welche passend sein könnte:
http://www.php.net/manual/de/ref.array.php
gruß,
wahsaga
hi!
dann nimmt man sich mal die übersichtsseite über die array-funktionen, und schaut da nach, welche passend sein könnte:
http://www.php.net/manual/de/ref.array.php
sorry. soweit hatte ich noch nicht gedacht, da ich gerade brot gebacken habe...
lg
azok
hi!
habe mir jetzt eine funktion dazu geschrieben. dummerweise funktioniert diese aber nicht, und ich finde den fehler einfach nicht... - Die funktion soll mir zählen, wie oft ein bestimmter string ($string) in einem array, einer datei ($file) vorkommt. jedoch gibt mir die funktion immer den wert 0 aus, und das, obwohl filesize != 0 ist. kann mir wer helfen?
Hier die funktion:
function array_count_var($string, $file)
{
$file_array = file($file);
$number = count($file_array);
$num = 0;
if(filesize($file) == 0)
{
return $num;
}
elseif(filesize($file) != 0 && in_array($string, $file_array))
{
for($i=0; $i<=$number; $i++)
{
if(in_array($string, $file_array))
{
$num++;
}
}
return $num;
}
else
{
return $num;
}
}
lg
azok
hi,
Die funktion soll mir zählen, wie oft ein bestimmter string ($string) in einem array, einer datei ($file) vorkommt. jedoch gibt mir die funktion immer den wert 0 aus, und das, obwohl filesize != 0 ist.
$file_array = file($file);
hast du berücksichtigt, dass file() beim einlesen die zeilenumbrüche am ende jeder zeile bestehen lässt?
dann würde in_array "blah" natürlich nicht finden, wenn in wirklichkeit "blah\n" im array steht ...
gruß,
wahsaga
hi!
hast du berücksichtigt, dass file() beim einlesen die zeilenumbrüche am ende jeder zeile bestehen lässt?
nein, dass nicht, da der betreffende string ganz am anfang jeder datei vorkommt:
news_1@blabla|blalba|blalbal
news_1 soll gefunden werden... - aber während ich da so schreibe, fällt mir doch eine andere frage dazu ein: kann das wort bzw. der string in einem langen wort 'versteckt' vorkommen, oder muss es 'getrennt' stehen?
z.b. findet php z.b. in dem string "Ichverwende@PHP" die Zeichenfolge "PHP" oder muss ich da meine funktion noch vorher einsetzen, die mir die strings bei einem @ abteilt (also daraus quasi 2 macht, d.h in ein array schreibt)? Ich hoffe ihr versteht was ich meine...
lg
azok
Hallo
z.b. findet php z.b. in dem string "Ichverwende@PHP" die Zeichenfolge "PHP"
Eben nicht. in_array prüft, ob ein String (Nadel) ein _vollständiges_Element_ eines Arrays (Heuhaufen) ist. Wenn du also einen String _in_ einem Arrayelement suchst, musst du dir was Anderes ausdenken. :-(
Tschö, Auge
hi!
Eben nicht. in_array prüft, ob ein String (Nadel) ein _vollständiges_Element_ eines Arrays (Heuhaufen) ist. Wenn du also einen String _in_ einem Arrayelement suchst, musst du dir was Anderes ausdenken. :-(
danke, für die info. naja, ich probiers mal mit meiner bereits geschriebenen funktion zum aufsplitten von dem @ und probier das zu verknüpfen etc.
lg
azok
hast du berücksichtigt, dass file() beim einlesen die zeilenumbrüche am ende jeder zeile bestehen lässt?
nein, dass nicht, da der betreffende string ganz am anfang jeder datei vorkommt:
news_1@blabla|blalba|blalbal
in_array() sucht nicht irgendein Teilstück in einem Array sondern einen vollständigen Wert. Wenn ein Wert in deinem Array news@bla heißt und du "nur" nach news suchst wird das von in_array() nicht gefunden.
In deinem Fall liefert in_array() true zurück, wenn du nach "news_1@blabla|blalba|blalbal\n" suchen würdest (beachte das \n am Ende).
Du musst also zu Fuß über das Array iterieren und die Elemente mit z.B. substr_count() auf ein Ergebnis > 0 testen. (substr_count() hat gegenüber strpos() den Vorteil, dass man bei einem Vorkommen des zu suchenden Strings an der Position 0 als Ungeübter nicht auf die Nase fällt. :-)
hi!
Du musst also zu Fuß über das Array iterieren und die Elemente mit z.B. substr_count() auf ein Ergebnis > 0 testen. (substr_count() hat gegenüber strpos() den Vorteil, dass man bei einem Vorkommen des zu suchenden Strings an der Position 0 als Ungeübter nicht auf die Nase fällt. :-)
naja, ich habe das jetzt folgendermaßen gemacht... - hat irgendeinen kleinen(?) fehler noch, da es nicht funktioniert
function array_count_var($string, $file)
{
$file_array = file($file);
$string = explode("@", $string);
$string = $string[0];
$number = count($file_array);
$num = 0;
if(filesize($file) == 0)
{
return $num;
}
elseif(filesize($file) != 0 && in_array($string, $file_array))
{
for($i=0; $i<=$number; $i++)
{
if(in_array($string, $file_array))
{
$num++;
}
}
return $num;
}
else
{
return $num;
}
}
vielleicht kann mir wer helfen...
lg
azok
hi!
jetzt probier ich schon so lange, bzw. denke über was geeignetes nach, und dann schaffe ich es bloß, nur die vom @ extrahierten strings auszugeben, was aber nicht sinn der sache ist. ich habe es mir dann weiter so überlegt:
den abgesplitteten ersten teil vor dem @ speichere ich dann in ein array, und kann dann bequem eine abfrage über in_array() machen. leider habe ich dann dort das problem, dass sich das element nicht wirklich (bzw. habe noch nicht die möglichkeit gehabt mich tiefer mit arrays zu befassen) gut ins array speichern lässt... ich habe das nämlich bisher so gelöst gehabt: (nur die for-schleife)
for($i=0; $i <= $fc; $i++)
{
$element = explode($del, $file_array[$i]);
$id = explode("@", $element[0]);
$string = $id[0];
$id_array = array();
$id_array[] = $string;
}
gebe ich das erzeugte mittels var_dump() aus, so erhalte ich:
array(1) { [0]=> string(6) "news_1" } array(1) { [0]=> string(6) "news_1" }
wie kann ich da machen, dass mir nich immer ein neues array angelegt wird, sondern immer das abgetrennet element in das array geschrieben wird? ich weiß, das ist jetzt ziemlich eine anfängerfrage, doch ich weiß heute einfach nicht mehr weiter...
lg
azok
hi,
wie kann ich da machen, dass mir nich immer ein neues array angelegt wird, sondern immer das abgetrennet element in das array geschrieben wird?
array vor der schleife mit dem schlüsselwort array() anlegen, und dann einfach in der schleife $arrayname[] = "nächster wert";
$arrayname[] = ... ist die schreibweise für "bitte lege ein neues element im array an, mit dem zugewiesenen wert".
die "vornehmerere" methode dafür wäre vielleicht ein explizites array_push() - ist aber fast immer unnötig.
gruß,
wahsaga
hi!
array vor der schleife mit dem schlüsselwort array() anlegen, und dann einfach in der schleife $arrayname[] = "nächster wert";
danke. meine for schaut jetzt so aus:
$array_id = array();
for($i=0; $i <= $fc; $i++)
{
$element = explode($del, $file_array[$i]);
$id = explode("@", $element[0]);
$string = $id[0];
$array_id[] = $string;
var_dump($array_id);
}
leider gibt er mir jetzt folgendes aus:
array(1) { [0]=> string(6) "news_1" } array(2) { [0]=> string(6) "news_1" [1]=> string(6) "news_1" } etc...
er schreibt mir das nicht in dasselbe array... warum? ich werd noch verrückt...
lg
azok
hi!
funktioniert schon. var_dump() saß in der schleife...
lg
azok
hi!
ich bin heute anscheinend blind vor meinen augen, aber ich finde keine geeignete funktion zum zählen wie oft ein bestimmtes element in einem array vorkommt...
lg
azok
Hallo,
ich bin heute anscheinend blind vor meinen augen, aber ich finde keine geeignete funktion zum zählen wie oft ein bestimmtes element in einem array vorkommt...
tja, wenn _alles_ fertig wäre, bräuchte man ja auch nicht zu programmieren. Wie wär's mit array_count_values()? Und dann mal das richtige Element abfragen.
Gruß, Andreas
hi!
[...] Wie wär's mit array_count_values()? Und dann mal das richtige Element abfragen.
mittlerweile bin ich da auch schon draufgekommen... - um es noch trivialer zu machen, wie frage ich dort das element auf seine zahl ab?
lg
azok
hi!
hab mal wieder voreilig gepostet. funktioniert alles. funktion sieht so aus:
$comment = "comments.dat";
$del = "|";
function array_count_var($string, $file)
{
global $del;
$num = 0;
$file_array = file($file);
$fc = count($file_array)-1;
$array_id = array();
for($i=0; $i <= $fc; $i++)
{
$element = explode($del, $file_array[$i]); # Array nach nummer zerlegen und bei | aufsplitten
$id = explode("@", $element[0]);
$splitted_id = $id[0];
$array_id[] = $splitted_id;
}
if(in_array($string, $array_id))
{
$ac = array_count_values($array_id);
$ac_string = $ac[$string];
echo $ac_string;
}
}
danke für eure antworten!
lg
azok
funktioniert alles. funktion sieht so aus:
noch ein paar Kommentare von mir gefällig? :-)
$comment = "comments.dat";
$del = "|";
Wenn du den Inhalt dieser Variable sowieso nicht ändern willst, ist hier eine Konstante empfehlenswert:
define('DELIMITER', '|');
Konstanten sind immer global und du kannst dir das global $del; sparen.
function array_count_var($string, $file)
{
global $del;$num = 0;
$num=0 ist überflüssig. Hast du sicher nur zu löschen vergessen.
$file_array = file($file);
$fc = count($file_array)-1;
Wenn du die Anzahl der Array-Elemente haben willst, solltest du diese nicht durch das -1 verfälschen.
$array_id = array();
for($i=0; $i <= $fc; $i++)
Wenn du $fc nicht verfälscht hättest, könntest du hier den zweiten Ausdruck einfach so schreiben: $i < $fc
Wenn du sowieso über das gesamte Array iterierst, kannst du auch gleich das Zählen der Elemente sparen und statt for ein foreach nehmen.
foreach ($file_array as $line)
In diesem Fall kannst du dir auch das $file_array sparen, da du es nicht weiter als solches brauchst. Das sähe dann so aus:
foreach (file($file) as $line)
{
$element = explode($del, $file_array[$i]); # Array nach nummer zerlegen und bei | aufsplitten
Hier müsstest du dann statt $del das DELIMITER und statt $file_array[$i] das $line aus dem foreach nehmen.
$id = explode("@", $element[0]);
$splitted_id = $id[0];
$array_id[] = $splitted_id;
Das list()-Konstrukt hift hier wieder zu vereinfachen.
list() weist den angebenen Variablen die Werte aus einem Array zu.
list($id) = explode("@", $element[0]);
$array_id[] = $id;
Das erste Element aus dem von explode zurückgegebenen Array wird $id zugewiesen, der Rest ignoriert.
Und auch das kann man noch mal vereinfachen:
list($array_id[]) = explode("@", $element[0]);
Damit haben wir zwei Variablen und zwei Zuweisungen gespart (und du hast was neues gelernt :-).
}
if(in_array($string, $array_id))
{
$ac = array_count_values($array_id);
$ac_string = $ac[$string];echo $ac_string;
Wenn der Hauptzweck der Funktionen darin besteht ein Ergebnis zu ermitteln, sollte dieses Ergebnis auch zurückgegeben werden.
return $ac_string;
Um das Ergebniss an ein beliebiges Medium auszugeben, kümmert sich dann der Programmteil, der die Funktion aufgerufen hat. Damit wird deine Funktion wieder ein Stück flexibler einsetzbar.
}
Und wenn nichts gefunden wird, muss natürlich auch was zurückgegeben werden.
return 0;
}
Zusammengefasst (und noch etwas weiter eingekürzt) sehen meine Vorschläge dann so aus:
define('DELIMITER', '|');
function array_count_var($string, $file)
{
$array_id = array();
// alle ids aus $file extrahieren
foreach (file($file) as $line)
{
list($element) = explode(DELIMITER, $line);
list($array_id[]) = explode('@', $element);
}
// alle gleichen Werte zusammenzählen lassen
$ac = array_count_values($array_id);
// Anzahl des gewünschten Wertes zurückgeben
return array_key_exists($string, $ac) ? $ac[$string] : 0;
}
Ergänzungen:
Variablen sollten sprechende Namen tragen. $element, $string, $array ist nicht weiter sprechend. Was für ein Element/String/Array ist das? Was du damit bezweckst muss man (mühsam) aus dem Quelltext interpretieren.
Ebenso helfen Kommentare im Quelltext das Anliegen des Autors zu verstehen, bzw. das sollen sie tun. Momentan sind deine Erinnerungen noch frisch.
Auch du wirst in einem Monat vergessen haben, was du mit deinem Code erreichen wolltest... Ich spreche da aus Erfahrung :-)
Dabei solltest du nicht schreiben, _was_ dein Code macht (das kann man meist aus dem Quelltext erkennen), sondern _warum_ du etwas machst, was du damit erreichen willst.
Ein geübtes Auge sieht aus den Komentaren und dem Quelltext auch wo der Autor möglicherweise Fehler eingebaut hat.