ich habe eine Datei mit folgendem Aufbau:
gruppe1:12233,23223,32323,2323,
gruppe2:331232,23232,23232,
Nun m�chte ich eine neue Gruppe anlegen, die dann auch noch alphabetisch
sortiert ist. Ich habe mir folgendes �berlegt, aber ich wei� nicht, wie ich
das neue Feld einf�ge.
//Gruppendatei
$ausgangsDatei = lists/.".$gruppe;
//Neuengruppennamen einlesen
$gruppenname = $_POST['gruppenname'];
//Einlesen der Gruppen Datei
$gruppenDatei = file_get_contents($ausgangsDatei);
//String in Arrays setzen
$array=explode("\n",$gruppenDatei);
//Array durchlaufen
foreach($array as $i)
{
//Teilen von Benutzername und Passwort
$parts = explode(':', $i, 2);
echo $parts[0]."-".$parts[1]."<br>";
$index = $parts[0];
// Testen, ob ein Kennwort vorhanden ist und die Daten wieder in ein
Benutzer Array �berf�hren
$users[$index] = array('gruppenname' => $parts[0],'rufnummern' =>
$parts[1]);
}
sort($users);
//Datei wieder zusammenf�hren
$NeueGruppenDatei = '';
foreach($users as $i)
{
if(empty($i['gruppenname'])!=1)
{
$NeueGruppenDatei .= $i['gruppenname'].':'.$i['rufnummer']."\n";
}
}
//echo $NeuePasswortDatei;
$handle = fopen($ausgangsDatei,"wb");
//Sperren der Datei f�r weitere Zugriffe
flock($handle,LOCK_EX);
//Schreiben der Datei
fwrite($handle,$NeueGruppenDatei);
fclose($handle);
Hat jemand eine Idee?
Stefan
>ich habe eine Datei mit folgendem Aufbau:
>
>gruppe1:12233,23223,32323,2323,
>gruppe2:331232,23232,23232,
>
>Nun m�chte ich eine neue Gruppe anlegen, die dann auch noch alphabetisch
>sortiert ist. Ich habe mir folgendes �berlegt, aber ich wei� nicht, wie ich
>das neue Feld einf�ge.
>
>//Gruppendatei
> $ausgangsDatei = lists/.".$gruppe;
> //Neuengruppennamen einlesen
> $gruppenname = $_POST['gruppenname'];
> //Einlesen der Gruppen Datei
> $gruppenDatei = file_get_contents($ausgangsDatei);
> //String in Arrays setzen
> $array=explode("\n",$gruppenDatei);
Tip: file() liefert direkt ein Array.
Und welche Datei liest Du ein, die oben als Beispiel angegebene? Ich
frag nur, weil mich die folgenden Bezeichner bzw. Kommentare etwas
verwirren.
> //Array durchlaufen
> foreach($array as $i)
Ung�nstige Bezeichner, insbesondere das $i - das ist �blicherweise f�r
Z�hlvariablen "reserviert". Besser w�re etwas wie
foreach ($groups as $group) {
...
o.�. Auch ist es hilfreich, sich bei den Bezeichnern auf eine Sprache
festzulegen (deutsch _oder_ englisch), anstatt zu mischen.
> {
> //Teilen von Benutzername und Passwort
Benutzername? Passwort? Oben ist doch von Gruppen die Rede.
> $parts = explode(':', $i, 2);
> echo $parts[0]."-".$parts[1]."<br>";
> $index = $parts[0];
Tip: Mit list() kann man sich gleich h�bsche, lesbare Variablen anlegen
lassen:
list($name, $nummern) = explode(':', $i);
> // Testen, ob ein Kennwort vorhanden ist und die Daten wieder in ein
>Benutzer Array �berf�hren
> $users[$index] = array('gruppenname' => $parts[0],'rufnummern' =>
>$parts[1]);
Das w�re dann:
$users[$name] = array(
'gruppenname' => $name,
'rufnummern' => $nummern
);
Andererseits k�nnte man das Ganze aber wohl auch abk�rzen:
list($name,) = explode(':', $i);
$users[$name] = $i;
Oder auch so ;-)
$users[reset(explode(':', $i))] = $i;
> }
> sort($users);
Du willst nach Schl�sseln (=Gruppennamen) sortieren, daher
ksort($users);
BTW: Sollte $users nicht besser $groups hei�en? Schlie�lich stehen da
Gruppeninformationen drin ...
> //Datei wieder zusammenf�hren
> $NeueGruppenDatei = '';
> foreach($users as $i)
> {
> if(empty($i['gruppenname'])!=1)
Wozu das if? Leere Gruppennamen gibts doch nicht. Und das !=1 ist, naja,
sagen wir mal, eigenwillig. Besser w�re:
if(!empty($i['gruppenname']))
Aber wie gesagt, das braucht's hier IMHO ohnehin nicht.
> {
> $NeueGruppenDatei .= $i['gruppenname'].':'.$i['rufnummer']."\n";
$NeueGruppenDatei .= implode(':', $i)."\n";
> }
>
> }
>
> //echo $NeuePasswortDatei;
> $handle = fopen($ausgangsDatei,"wb");
>
> //Sperren der Datei f�r weitere Zugriffe
> flock($handle,LOCK_EX);
>
> //Schreiben der Datei
> fwrite($handle,$NeueGruppenDatei);
> fclose($handle);
Tip: Nimm file_put_contents().
>Hat jemand eine Idee?
Was war die Frage? ;-)
Ach so ... na, f�ge einfach den neuen Gruppennamen oben an geeigneter
Stelle vor dem ksort() ins $users-Array ein:
...
foreach (...) {
...
}
$users[$gruppenname] = ''; // noch keine Nummern �.�.
ksort($users);
...
Eigentlich k�nnte man sich die ganze Ex- und Implodiererei der einzelnen
Zeilen aber auch komplett schenken:
* Datei mit file() in Array einlesen
* Neuen Gruppenstring erzeugen und hinten dranklatschen
* implode() und file_put_contents() zum Speichern
* Fertig.
Vielleicht hab ich aber auch das ganze Script falsch verstanden. Wie
gesagt, die Kommentare und Bezeichner sind z.T. ziemlich verwirrend.
HTH
Micha
"Michael Fesser" <net...@gmx.de> schrieb im Newsbeitrag
news:v55ni5llhe1uk3609...@4ax.com...
>
> * Datei mit file() in Array einlesen
> * Neuen Gruppenstring erzeugen und hinten dranklatschen
> * implode() und file_put_contents() zum Speichern
> * Fertig.
>
Kann ich die denn dann auch sortieren?
Stefan
Oops, das hatte ich vergessen:
* Datei mit file() in Array einlesen
* Neuen Gruppenstring erzeugen und hinten dranklatschen
* sort()
* implode() und file_put_contents() zum Speichern
* Fertig.
Damit w�rde die Datei gewisserma�en zeilenweise sortiert, inklusive des
neuen Eintrags. Da der Gruppenname jeweils direkt am Anfang der Zeile
steht, sollte das Ergebnis wie gew�nscht sein.
Micha
> ich habe eine Datei mit folgendem Aufbau:
>
> gruppe1:12233,23223,32323,2323,
> gruppe2:331232,23232,23232,
>
> Nun möchte ich eine neue Gruppe anlegen, die dann auch noch alphabetisch
> sortiert ist. Ich habe mir folgendes überlegt, aber ich weiß nicht, wie ich
> das neue Feld einfüge.
Dein Ansatz ist *viel* zu kompliziert (und undurchdacht). Wie Michael
schon sagte, sind deine Kommentare und Bezeichner an vielen Stellen
unbrauchbar, weil sie nur das ohnehin Offensichtliche erwähnen.
> Hat jemand eine Idee?
$groups = file( $filename );
$groups[] = $newGroup;
sort( $groups );
file_put_contents( $filename, $groups );
MfG
Niels
--
| http://www.kolleg.de · Das Portal der Kollegs in Deutschland |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · e-Commerce · Joomla! Content Management |
------------------------------------------------------------------
>Dein Ansatz ist *viel* zu kompliziert (und undurchdacht). Wie Michael
>schon sagte, sind deine Kommentare und Bezeichner an vielen Stellen
>unbrauchbar, weil sie nur das ohnehin Offensichtliche erw�hnen.
>
>> Hat jemand eine Idee?
>
>$groups = file( $filename );
>$groups[] = $newGroup;
>sort( $groups );
>file_put_contents( $filename, $groups );
In der letzten Zeile braucht's IMHO noch ein explizites implode(), sonst
gehen die Zeilenumbr�che in der Datei fl�ten.
Micha
Also m�sste das quasi so aussehen:
$datei = "lists/.".$gruppe;
$gruppen = files($datei);
$neueGruppe = $_POST['gruppenname'].":";
sort($gruppen);
$gruppenzusammen = implode($gruppen);
file_put_contents($datei,$gruppenzusammen,LOCK_EX);
Aber wie klatsche ich denn die neue Gruppe jetzt an das Array dran?
Stefan
>> $groups = file( $filename );
>> $groups[] = $newGroup;
>> sort( $groups );
>> file_put_contents( $filename, $groups );
>
> In der letzten Zeile braucht's IMHO noch ein explizites implode(), sonst
> gehen die Zeilenumbrüche in der Datei flöten.
Stimmt - file_put_contents() macht das implizite implode() mit einem
Leerstring.
>"Michael Fesser" <net...@gmx.de> schrieb im Newsbeitrag
>news:jf9ni59bfufltm69c...@4ax.com...
>>
>> * Datei mit file() in Array einlesen
>> * Neuen Gruppenstring erzeugen und hinten dranklatschen
>> * sort()
>> * implode() und file_put_contents() zum Speichern
>> * Fertig.
>>
>
>
>Also m�sste das quasi so aussehen:
>
> $datei = "lists/.".$gruppe;
> $gruppen = files($datei);
> $neueGruppe = $_POST['gruppenname'].":";
> sort($gruppen);
> $gruppenzusammen = implode($gruppen);
> file_put_contents($datei,$gruppenzusammen,LOCK_EX);
Fast.
>Aber wie klatsche ich denn die neue Gruppe jetzt an das Array dran?
Einfach mit $array[] = ... hinten dran. Das hatte Niels auch schon
geschrieben. Probier's mal so:
$datei = "lists/$gruppe";
$gruppen = files($datei);
$neueGruppe = $_POST['gruppenname'].":";
$gruppen[] = $neueGruppe;
sort($gruppen);
$gruppenzusammen = implode("\n", $gruppen);
file_put_contents($datei, $gruppenzusammen, LOCK_EX);
Ggf. sollten noch �berpr�fungen erg�nzt werden, ob $_POST['gruppenname']
�berhaupt existiert und einen zul�ssigen Wert enth�lt etc.
Micha
> $datei = "lists/$gruppe";
> $gruppen = files($datei);
s/files/file/
> $neueGruppe = $_POST['gruppenname'].":";
> $gruppen[] = $neueGruppe;
> sort($gruppen);
> $gruppenzusammen = implode("\n", $gruppen);
> file_put_contents($datei, $gruppenzusammen, LOCK_EX);
LOCK_EX macht mW. nur Sinn in Verbindung mit Streams.
>Michael Fesser schrieb:
>
>> $datei = "lists/$gruppe";
>> $gruppen = files($datei);
>
>s/files/file/
Don't drink and code. ;-D
>> $neueGruppe = $_POST['gruppenname'].":";
>> $gruppen[] = $neueGruppe;
>> sort($gruppen);
>> $gruppenzusammen = implode("\n", $gruppen);
>> file_put_contents($datei, $gruppenzusammen, LOCK_EX);
>
>LOCK_EX macht mW. nur Sinn in Verbindung mit Streams.
Kann ich nix zu sagen, hab'sch bisher nicht benutzt.
Micha
Und wie genau funktioniert die Sortierfunktion, denn meine Datei sieht jetzt
so aus:
Alte Säcke: 0900/3333333,0800/3301000,
Stefan: 123/456789,
aaa:
auto: 0123/123456,0123/6635525,
bus: 0111/122345,0122/36363636,
Und wie kann ich den String überprüfen ob er schon vorhanden ist? Denn ich
gebe ja zB. auto ein, aber der vorhandene String sieht ja anders aus?!
Stefan
> Aber wie kann ich denn die Datei vor weiteren Schreibzugriffen schützen?
http://de.php.net/manual/en/function.chmod.php
> Und wie genau funktioniert die Sortierfunktion,
http://de.php.net/manual/en/function.sort.php
> Und wie kann ich den String überprüfen ob er schon vorhanden ist?
http://de.php.net/manual/en/language.operators.comparison.php
> Denn ich
> gebe ja zB. auto ein, aber der vorhandene String sieht ja anders aus?!
Das ist eine völlig andere Aufgabenstellung, als du sie definiert hattest.
"Niels Braczek" <nbra...@freenet.de> schrieb im Newsbeitrag
news:hgk4u1$oac$00$1...@news.t-online.com...
> http://de.php.net/manual/en/function.chmod.php
Damit kann ich ja "nur" ACL der Datei verändern, da der Apache immer mit
www-data zugreift, kann ich Datei so ja nicht vor Mehrfachzugriff der WebApp
schützen?!
> http://de.php.net/manual/en/function.sort.php
Das habe ich mir angesehen, ich kann es mir aber denn nicht erklären...
>
> Das ist eine völlig andere Aufgabenstellung, als du sie definiert hattest.
>
Also muss ich doch mit explode den Teil vor mit : Teilen und den part
überprüfen?
Stefan
Du wolltest die Datei vor weiteren Schreibzugriffen schützen. Das
erreichst du mit chmod 0444.
Vor *gleichzeitigem* Schreibzugriff brauchst du hier keinen Schutz, da
das in *einer* Operation eschieht.
>> http://de.php.net/manual/en/function.sort.php
> Das habe ich mir angesehen, ich kann es mir aber denn nicht erklären...
Offensichtlich bist du den Hinweisen auf der Seite nicht gefolgt, denn
dann hättest du http://de2.php.net/manual/en/array.sorting.php gesehen
und dort natcasesort() gefunden.
>> Das ist eine völlig andere Aufgabenstellung, als du sie definiert hattest.
> Also muss ich doch mit explode den Teil vor mit : Teilen und den part
> überprüfen?
Wenn es das ist was du willst, ja. Dann musst du auch die Teile rechts
vom Doppelpunkt auseinandernehmen, Dubletten feststellen und eliminieren
und anschließend wieder alles zusammenführen.
"Niels Braczek" <nbra...@freenet.de> schrieb im Newsbeitrag
news:hgloem$p32$00$1...@news.t-online.com...
>
> Offensichtlich bist du den Hinweisen auf der Seite nicht gefolgt, denn
> dann hättest du http://de2.php.net/manual/en/array.sorting.php gesehen
> und dort natcasesort() gefunden.
>
Ah danke!
>
> Wenn es das ist was du willst, ja. Dann musst du auch die Teile rechts
> vom Doppelpunkt auseinandernehmen, Dubletten feststellen und eliminieren
> und anschließend wieder alles zusammenführen.
>
Ich habe das jetzt mal so gelöst:
foreach($gruppen as $i)
{
//echo "Schleife_";
$parts = explode(':', $i, 2);
//echo "$parts[0]_";
if($parts[0]!=$_POST['gruppenname']){
echo "In der If Abfrage_";
$testbenutzername=true;
}
else{
echo "Else Anweisung";
$testbenutzername=false;
break;
}
}
if($testbenutzername==true){
$gruppen[] = $neueGruppe;
natcasesort($gruppen);
$gruppenzusammen = implode($gruppen);
file_put_contents($datei,$gruppenzusammen,LOCK_EX);
$positvemeldung ="Die Gruppe wurde angelegt!";
}
else{
$fehlermeldung = "Der Gruppenname existiert bereits!";
}
}
else{
//echo "Else Zweig";
$fehlermeldung = "Bitte geben Sie einen Gruppennamen ein!";
}
Doch das Problem ist, wenn die Datei ganz leer ist bekomme ich nicht
testbenutzername auf true... ist natürlich auch etwas doof... Gibt es dafür
eine Lösung?
Stefan
> Doch das Problem ist, wenn die Datei ganz leer ist bekomme ich nicht
> testbenutzername auf true... ist natürlich auch etwas doof... Gibt es dafür
> eine Lösung?
Ja. ZB. empty().