kostenloser Webspace werbefrei: lima-city


Suche auf lima-city

  • in: Doubletten in CSV verhindern

    geschrieben von erlebnis

    ok, ich glaub ich habe meine csv_to_array Funktion so umgebaut,
    damit es auch Array je einzele Spalte liefern kann ...

    Wenn man Parameter $node als Leerstring (oder null oder false) angibt,
    dann wird die komplette CSV in Array umgewandelt (mit allen Spalten)

    Wenn man als Parameter $node einen Spalten-Name übergibt,
    dann bekommt man ein einfaches (ein-dimensionales) Array
    mit nur den Werten aus dieser einen Spalte

    wenn ohne Kopf-Zeile ($head=false), dann als $node Spalten-ID mit 1 beginnen,
    nicht mit 0 (Null) weil wenn $node=0 dann gilt $node bei empty() als 'leer'
    ... habe es aber noch nicht mit CSV ohne Kopfzeile ausprobiert ... :oO

    <?php 
    // ------------------------------------------------------------------- 
    
    function csv_to_array($file,$node='',$head=true,$delim=';',$len=0) {
        $return = false;
        $handle = fopen($file, "r");
        if ($head) {
            $header = fgetcsv($handle, $len, $delim);
        }
    	$i=1; 
        while (($data = fgetcsv($handle, $len, $delim)) !== FALSE) { 
            if ($head AND isset($header)) { 
    		
                foreach ($header as $key => $heading) { 
    				if (!empty($node)) { 
    					if ( $heading == $node ) { 
    					$row = (isset($data[$key])) ? $data[$key] : ''; 
    					}
    				}
    				else { 
    				$row[$heading] = (isset($data[$key])) ? $data[$key] : '';
    				}
    				
                }
                $return[] = $row;
    			
            } 
            else { 
    		
    			if (!empty($node))  { 
    			   if ( $node == $i ) { 
    				$return[] = $data[$i]; 
    			   }
    			}
    			else { 
    				$return[] = $data; 
    			}
    		
    		}
    		
        $i++; 
    	}
        fclose($handle);
        return $return;
    } 
    
    // ------------------------------------------------------------------- 
    ?>



    Dann kann ich für je nur eine Spalte einzeln ein Array raus holen
    und prüfen, ob der Wert aus Eingabe als Wert (nicht) im Array vorkommt.

    $varray = csv_to_array($save_file, 'vorname'); 
    
    if ( !in_array($save_vorname , $varray) ) {  
    // --- OK ... der Vorname ist noch nicht in den Daten 
    } 
    else { 
    // --- STOP ... der Vorname ist bereits vorhanden
    }


    Das funktioniert aber nur für eine Spalte, also entweder 'vorname' oder 'name'

    ok, ... Ich zwar kann auch beide Spalten so prüfen
    $varray = csv_to_array($save_file, 'vorname'); 
    $narray = csv_to_array($save_file, 'name'); 
    
    if ( !in_array($save_vorname , $varray) && !in_array($save_name, $narray)  ) {  
    // ...... ok ... 
    }
    else { 
    // ..... nicht speichern ... schon vorhanden ...
    }


    aber dann würde auch "Tina Holle" oder "Bernd Toll" fälschlicher Weise als Doublette erkannt,

    also muss ich wohl die zwei Spalten zu einem String zusammen bauen und diesen dann prüfen

    $varray = csv_to_array($save_file, 'vorname'); 
    $narray = csv_to_array($save_file, 'name'); 
    
    $xarray = array(); 
    $anzahl = count($varray); 
    for ($x=0; $x<$anzahl; $x++) { 
    $xarray[] = $varray[$x].'_'.$narray[$x]; 
    }
    
    $checkstring = $save_vorname.'_'.$save_name;
    
    if ( !in_array($checkstring, $xarray) ) {  
    // ...... ok ...
    }
    else { 
    // ..... nicht speichern ... schon vorhanden ...
    }


    das macht die Sache aber ganz schön kompliziert,

    aber wahrscheinlich immernoch einfacher, als die Funktion so um zu bauen,
    dass die auch mit mehreren $node arbeiten kann und ein Array mit $checkstring je Zeile zurück gibt
    welches man dann mit dem $checkstring aus der Formular-Eingabe vergleichen kann (in_array)

    ... wie gesagt, die Beispiel-Daten hier sind stark vereinfacht,
    bei den echten Daten gibt es auch andere Spalten-Kombinationen,
    die nicht "doppelt" gespeichert werden dürfen, z.B. Telefon-Nr, etc.


    PS: ein Umbau von fgetcsv() zu fgets() und Zeile splitten wäre denke ich schon machbar
    bzw. man kann sich für C++ etc. dann ja einen eigene fgetcsv() Funktion selber machen
    wenn die nicht als Basis-Funktion enthalten ist wie bei PHP ...
    ... aber da ich es sowieso erstmal nur im Web brauche, ist PHP fgetcsv ja verfügbar.
  • in: Doubletten in CSV verhindern

    geschrieben von erlebnis

    Hallo
    ich will per PHP eine einfache CSV Datei schreiben (pflegen: edit / new / delete)

    vereinfachte Beispiel-Daten: CSV-Datei mit Kopf-Zeile (= Spalten-Namen) und 3 Daten-Zeilen

    "vorname";"name","abteilung"
    "Tina";"Toll";"Personal"
    "Host";"Holle";"Einkauf"
    "Bernd";"Brot";"Marketing"


    über eine Formular kann man neue Einträge erstellen. ($_POST ---> fwrite() in die CSV)

    <?php
    // -------------------------------------------------------------
    // --- Speichern in CSV bei neuer Datensatz ---
     
    if ( !empty($_POST['vorname']) && !empty($_POST['name']) && !empty($_POST['abteilung']) ) {
     
    $save_vorname   = trim(chop($_POST['vorname']));
    $save_name      = trim(chop($_POST['name']));
    $save_abteilung = trim(chop($_POST['abteilung']));
     
    // --- ??? ... hier prüfen, ob vorname und name schon eingetragen sind ... ???
    // --- und nur Speichern, wenn NEIN (noch nicht drin) ... sonst Meldung
     
    $save_file = 'data/mitarbeiter1.csv';
     
    $kopf_zeile = '"vorname";"name";"abteilung"'."\n";
     
    $datenzeile = '"'.$save_vorname.'";"'.$save_name.'";"'.$save_abteilung.'"'."\n";
     
    if (!file_exists($save_file)) {
         
        $handle1 = fopen($save_file, 'w', 0666);  // ---- neue Datei 'w"' erstellen ----
        fwrite($handle1,$kopf_zeile); // ---- neue Kopf-Zeile schreiben ----
        fwrite($handle1,$datenzeile); // ---- neue Daten-Zeile schreiben ----
        fclose($handle1);
     
    }
    else {
     
        $handle1 = fopen($save_file, 'a', 0666);  // ---- in Datei 'a' dazu schreiben----
        fwrite($handle1,$datenzeile); // ---- neue Daten-Zeile schreiben ----
        fclose($handle1);
         
    }
     
    print "<p>OK ... die Daten wurden gespeichert.</p>\n";
     
     
    }
    else {
    // -------------------------------------------------------------
    // --- Formular zur Eingabe neuer Datensatz ---
     
    $formulat1 = '
    <form name="form1" method="post" action="">
      Vorname:   <input type="text" name="vorname" size="30" maxlength="60" /> <br />
      Nachname:  <input type="text" name="name" size="30" maxlength="60" /> <br />
      Abteilung: <input type="text" name="abteilung" size="30" maxlength="100" /> <br />
      <br /> OK: <input type="submit" name="go" value="Speichern" />
    </form>
    ';
     
    print $formulat1;
     
    }
    // -------------------------------------------------------------
    ?>


    Wie kann ich verhindern, dass eine Person / ein voller Name (= vorname + name)
    nicht doppelt eingetragen werden kann,

    also wenn jemand in die Beispiel-Daten (oben) nochmal "Tina Toll" eintragen will,
    dass dann eine (Fehler-) Meldung kommt wie z.B: "Der Name ist bereits eingetragen."


    was ist besser,

    + die CSV als Array einlesen (fgetcsv) und dann Eingabe mit Array-Elemente vergleichen,
    + oder die CSV als "String" durchsuchen nach Teilstring (Zeichenkette) :
    "Tina";"Toll";


    Das Vorkommen einzelner Zeichen suchen / finden kann man ja mit strpos()
    ... aber geht das auch mit einem Teilstring (Zeichenkette) ?

    Oder ist es mit Array besser (schneller) ... oder hat jemand noch ne andere Idee ?
  • in: Kein Border Radius bei Internet Explorer

    geschrieben von erlebnis

    z.B. mit ner .htc

    siehe hier: http://fetchak.com/ie-css3/
    . oder hier: http://code.google.com/p/curved-corner/
    . oder hier: http://css3pie.com/

    oder als JS:
    http://www.curvycorners.net/


    ... oder einfach selber googeln nach: Border Radius IE

  • in: Können php Scripts parallel laufen?

    geschrieben von erlebnis

    unlikus schrieb:
    ..., da sonst 2 User den gleichen Platzhalter nutzen, der vorher für sie gespielt hat.


    ich vermute mal, die Besucher können schon ohne Anmeldung als "Gast" aktiv werden (Spielen)
    und wenn dieser Gast sich dann als "User" anmeldet, dann sollen die bisher als Gast gespielten
    Ergebnisse (Spieler-Daten) auch für den neuen User-Account übernommen werden.

    Wahrscheinlich wird dem "Gast" ein "Platzhalter" (z.B. Timestamp) als ID zugewiesen
    damit die Gast-Spieler-Daten gespeichert und dann für User übernommen werden können,

    Es geht also wohl darum, den Besucher (als User) eindeutig zu identifizieren (und zuordnen) zu können.

    Wenn Du auch jeden Gast in MySQL mit auto-increment speicherst, kannnst Du ja diese ID nehmen,


    ... geht auch wenn Du nicht in MySQL sondern die "Gast" Daten in einer _SESSION speicherst

    auch wenn zwei Gäste gleichzeitig zu Spielen beginnen,
    dann sollte ja die Session-ID je Gast auch eindeutig sein.

    $gast_sid = session_id();
    // ------ oder ------ 
    $gast_sid = $_COOKIE["PHPSESSID"];


    ... oder gelcih je Gast ein "echtes" COOKIE anlegen ?

    ... zudem könntest Du eine Komination aus Timestamp und IP-Adresse zur "Erkennung" nehmen
    $user_hash = md5( $timestamp . $userip );


    Es gibt viele Möglichkeiten, jedem Gast (Besucher der spielt) eine eindeutige ID zu-zuwweisen.

    wichtig ist halt, dass jeder "Gast" eindeutig zugeordnet werden kann, dann ist die Reihenfolge egal

  • in: Textarea: maximale Größe des Inhalts

    geschrieben von erlebnis

    Hallo

    wenn die 3 Zeilen aus durchgehendem Text (ohne Zeilenumbruch) entstehen,
    dann brauchst Du denke ich eine monospace Schriftart,

    denn dazu musst Du Wissen, wie breit eine Buchstabe in Pixel ist,
    also z.B. 45 Buchstaben = 298 Pixel,
    dann im String alle 45 Buchstaben einen Zeilenumbruch einfügen.


    Frage: ist die Textarea für User oder für Admin ?
    wenn für Admin, dann kann man erwarten, das bei Eingabe auch der Zeilenumbruch kommt
    aber wenn für User, dann kann man davon ausgene, das es nicht alle kapieren (wollen)

    Wenn es immer (maximal) 3 Zeilen werden sollen (bei Eingabe)
    warum machst Du dann nicht anstatt Textarea einfach 3 normale Text-Felder, je Zeile ein Feld
    und baust dann zur Ausgabe diese 3 Felder zu einem Text zusammen ?!

    oder Du musst für Deine Schriftart die Zeichen-Anzahl
    je nach dem am breitesten Buchstaben (z.B.: W) begrenzen
    ... also testen, wieviele W nebeneinander (mit z.B. Verdana) in 300px rein passen)
    und diesen max. Wert dann für maxlength verwenden,

    bzw. per Javascript bei überschreiten dieses max. Wert die Meldung erzeugen

    aber einfacher (schöner) wäre es mit monospace Schriftart,
    da musst du zwar auch zählen, wieviele Buchstaben in 300 px rein passen (je nach Schrift-Größe)
    aber dann passt es für jeden Text, nicht nur für W

  • in: Keyword-Funktion: wie Worte ausschließen ?

    geschrieben von erlebnis

    ok ... Danke ... array_diff() ... vergleicht Arrays und gibt die Unterschiede zurück.

    also gleich alles in einer Funktion dann wohl so:
    (habe noch $ype dazu gemacht für Rückgabe-Format)

    // --------------------------------------------------------------------
    // -------------------- function: get_keywords() ---------------------- 
    // --------------------------------------------------------------------
    // --- Parameter (1):     $string     (string) Beschreibung / Text (UTF-8) 
    // --- Parameter (2):     $blacklist  (array) nicht als Keyword verwenden 
    // --- Parameter (3):     $type       (string) Format: array, string, json 
    // --- Parameter (4):     $length     (int) mindest Länge (Zeichen) je Wort 
    // --- Parameter (5):     $maxkey     (int) maximale Anzahl der Keywords 
    // --------------------------------------------------------------------
    // --------------------------------------------------------------------
    
    function get_keywords( $string, $blacklist=array(), $type='array', $length=5, $maxkey=20 ) {
    	
    	$xlength = ($length-1);
    	$kdata1 = array();
    	
    	$pattern1 = '/[\p{Lu}]{1}+[(\p{Lu}|\p{Ll})]{'.$xlength.',}/u'; 
    	
    	preg_match_all($pattern1, $string, $kdata1);
    	
    	$kdata2 = array_count_values($kdata1[0]);
    	arsort($kdata2);
    	
    	$kdata3 = array_keys($kdata2);
    	
    	if (!empty($blacklist))        { $kdata3 = array_diff($kdata3, $blacklist); } 
    	if (count($kdata3) > $maxkey)  { $kdata3 = array_slice($kdata3, 0, $maxkey); } 
    	
    	if (empty($type) || $type == 'array')   { $out = $kdata3; } 
    	            elseif ($type == 'json')    { $out = json_encode($kdata3); } 
    	            elseif ($type == 'string')  { $out = implode(',',$kdata3); } 
    	
    	return $out;
    }
    
    // --------------------------------------------------------------------
    // --------------------------------------------------------------------



    ok, das if .. elseif ... für $type könnte man auch als switch() machen,
    aber ich glaube, das macht hier keinen großen Unterschied.

    ... mein TEST hat zumindest funktioniert:

    // ------ Ausgangs-Text ------
    $text = 'Der Gorilla und das Nashorn spielen Golf mit dem Elefant und der Giraffe';
    
    // ------ Keyword-Blacklist Array ------
    $nogo = array('Elefant', 'Katze'); 
    
    // ------ Aufruf der Funktion ------
    $keyw = get_keywords($text, $nogo, 'string'); 	
    
    // ------ Ergebnis: $keyw = 'Giraffe,Nashorn,Gorilla' ------
    print "<p>".$keyw."</p>\n";



    die Keywords werden ja schon nach Häufigkeit (Vorkommen) sortiert,
    und man bekommt das Ergebnis als Array oder als Komma getrennter String oder als JSON
    ... hat noch jemand ne Idee, ob (wie) man das noch "besser" machen kann ?

    bzw. meint Ihr dass das mit dem Format ($type) in dieser Funktion Sinn macht ?!?,
    oder "nur" Array Rückgabe, denn umformen kann man dann ja immernoch nach Bedarf

  • in: Keyword-Funktion: wie Worte ausschließen ?

    geschrieben von erlebnis

    Hallo

    ich habe eine kleine Funktion, die mir aus einem Text die Keywords holt:
    (nur die mit Großbuchtsaben beginnen oder nur aus Großbuchstaben bestehen und eine mindest-Zeichen-Länge haben)

    // ------------------------------------------------------------------ 
    // --- Parameter:     $string     (string) Beschreibung / Text (UTF-8) 
    // --- Parameter:     $length     (int) mindest Länge (Zeichen) je Wort
    // --- Parameter:     $maxkey     (int) maximale Anzahl der Keywords
    // ------------------------------------------------------------------ 
    
    function get_keywords( $string, $length=5, $maxkey=30) {
        
        $xlength = ($length-1); 
        $kdata1 = array(); 
        
        $pattern1 = '/[\p{Lu}]{1}+[(\p{Lu}|\p{Ll})]{'.$xlength.',}/u';  // --- utf-8 --- 
        
        preg_match_all($pattern1, $string, $kdata1);
        
        $kdata2 = array_count_values($kdata1[0]); 
        arsort($kdata2); 
        
        $kdata3 = array_keys($kdata2); 
        $out_arr = array_slice($kdata3, 0, $maxkey); 
        
        return $out_arr; 
    }
    
    
    // ------------------------------------------------------------------


    Wie kann ich da jetzt eine Liste an Worten einfügen, die nicht zu Keywords werden sollen
    also quasi eine Black-List, z.B. ein Array of Keywords, die ausgeschloßen werden sollen

    am besten gleich schon in der Funktion, $blacklist als Parameter-Übergabe oder global definiert.

    $blacklist = array('Elefant', 'Katze'); 
    
    $text = 'Der Gorilla und das Nashorn spielen Golf mit dem Elefant und der Giraffe'; 
    $keyw = get_keywords($text); 
    
    // Ergebnis: $keyw = array( 'Gorilla', 'Nashorn', 'Elefant', 'Giraffe');


    Wie kann ich jetzt die $blacklist in die Funktion einbauen,
    damit diese Wote dann nicht im Ergebnis ankommen ? ... (hier im BSP ohne: Elefant)

    Danke!

  • in: Array zu DropDown mit Spalten ?

    geschrieben von erlebnis

    ok, Danke

    habe es mit str_pad() ausprobiert
    und gemerkt, nur maximale Länge genügt nicht, ich brauche den Unterschied zur maximalen Länge
    um den $abstand entsprechende Zeichen zu-zuweisen. ... siehe: $xinsert unten



    ... aber hat nicht ganz funktioniert,
    weil ja auch noch die einzelnen Zeichen unterschiedliche Breite haben

    ... erst wenn ich CSS für die DropDown-Box mache:
    select { font-family: "Courier New", Courier, mono; }

    dann klappt es auch :) ...

    hier nocmal der ganze (test) Code:

    <?php
    // -------------------------------------------------------------------- 
    
    $daten = array(
        'a' => array ( 'Text1', '14' ),
        'b' => array ( 'Text2 blablabla', '257' ),
        'c' => array ( 'Text3', '74' ),
        'd' => array ( 'Text4 Bezeichnung', '361' ),
    );
    
    
    
    $maxlen = 0;
    foreach($daten as $val) {
      $val_len = strlen($val[0]);
      if ($val_len > $maxlen) { $maxlen = $val_len;   }
    }
    
    
    $maxlen = ($maxlen+2);  // ---- plus mindest-Abstand von 2 Leerzeichen --- 
    
    $select_style = 'font-family: Courier, mono;'; 
    
    
    echo "  <select name=\"auswahl\" style=\"".$select_style."\">\n";
    
    foreach($daten as $key=>$val) { 
    
    $abstand = ' ';
    $val_len = strlen($val[0]);
    $xinsert = ($maxlen - $val_len);  // ---- fehlende Zeichen bis $maxlen ---- 
    
    // ----- str_pad() mit einfachem Leerzeichen, weil &nbsp; mehrere Zeichen hat -----
    $abstand = str_pad($abstand, $xinsert, ' ', STR_PAD_LEFT);
    
    // ---- dann die einfachen Leerzeichen zu &nbsp; umwandeln ----
    $abstand = str_replace(' ', '&nbsp;', $abstand);
    
    echo "      <option value=\"".$key."\"> ".$val[0]." ".$abstand." ".$val[1]." </option>\n";
    
    }
    
    
    echo "  </select>\n";
    
    
    
    // ----------------------------------------------------------------- 
    ?>


    Ergebnis: (passt)
    <select name="auswahl" style="font-family: Courier, mono;">
          <option value="a"> Text1 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 14 </option>
          <option value="b"> Text2 blablabla &nbsp;&nbsp;&nbsp;&nbsp; 257 </option>
          <option value="c"> Text3 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 74 </option>
          <option value="d"> Text4 Bezeichnung &nbsp;&nbsp; 361 </option>
      </select>

    ohne das festlegen der Schriftart auf mono-space (mit CSS) gehts nicht,
    weil sonst ja unterschiedliche Zeichen verschiedene Breite haben

    ... aber gibt es da keine andere Möglichkeit, so ein Dropdown mit Spalten im Text zu formatieren ?

  • in: Array zu DropDown mit Spalten ?

    geschrieben von erlebnis

    Hallo

    wie kann ich ein DropDown Formular machen,
    bei dem im angezeigten Text einzelner <option> Elemente
    nicht nur einfacher Text, sondern als Spalten (2 Werte) agezeigt werden.

    Beispiel Daten:
    $daten = array(
        'a' => array ( 'Text1', '14' ),
        'b' => array ( 'Text2 blablabla', '257' ),
        'c' => array ( 'Text3', '74' ),
        'd' => array ( 'Text4 Bezeichnung', '361' ),
    );


    Ausgabe Daten:
    echo "  <select name=\"auswahl\">\n"; 
    
    $abstand = '&nbsp;&nbsp;&nbsp;'; 
    
    foreach($daten as $key=>$val) { 
    echo "      <option value=\"".$key."\"> ".$val[0]." ".$abstand." ".$val[1]." </option>\n"; 
    }
    
    echo "  </select>\n";



    damit es - ähnlich wie bei Tabelle - Spalten / gleichbleibende Abstände hat

    INFO: habe die
    &nbsp;
    durch einfache Leerzeichen ersetzt,
    damit man den Unterschied auch "sehen" kann ...

    und ... der $key kann auch unterschiedliche Zeichen-Anzahl haben
    hier zur Vereinfachung mal nur mit a,b,c,d (damit das Problem "optisch" besser darstellbar ist)

    ... nicht so:
    <select name="auswahl">
          <option value="a"> Text1    14 </option>
          <option value="b"> Text2 blablabla    257 </option>
          <option value="c"> Text3    74 </option>
          <option value="d"> Text4 Bezeichniúng    361 </option>
      </select>


    ... sondern so:
    <select name="auswahl">
          <option value="a"> Text1               14 </option>
          <option value="b"> Text2 blablabla     257 </option>
          <option value="c"> Text3               74 </option>
          <option value="d"> Text4 Bezeichnung   361 </option>
      </select>


    also quasie mit Spalten ... geht sowas?

    es geht nicht um Abstände im Quellcode, sondern um Ausgabe (Anzeige im Browser)

    klar ist:
    Wenn ich es mit Leerzeichen machen würde, dann muss ich, damit das angezeigt wird,
    anstatt einfache Leerzeichen ja "geschützes Leerzeichen"
    &nbsp;
    verwenden.

    aber wie bekomme ich je Element die passende Anzahl Leerzeichen,
    ... oder gibt es eine andere (bessere) Möglichkeit, den <option> Text mit Spalten auszugeben ?
    evtl. mit CSS?


Login zum Webhosting ohne Werbung!