dedlfix: Funktioniert!!!

Beitrag lesen

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.