PHP_Anfänger: Vorkommen von bestimmten Wert in einem Array ermitteln

Hallo ich bins wiedermal

Ich habe folgendes Problem, ich möchte die Anzahl bestimmter Werten in einem Array ermitteln.

Das Script das ich dazu geschrieben habe, durchläuft ein Verzeichnis und speichert die Treffer in einem Array. Der ganze Vorgan ist nötig, damit ein Ordner angelegt werden kann, der bereits vorhanden ist.

Bevor der Ordner angelegt wird, überprüft das Script, ob der Ordner bereits existiert, ist dies der Fall, so sollte der Ordner der angelegt werden soll ein Zusatz (z.B. $dir.'_'$anzahl_existierender_ordner_mit_selben_vorkommen_im_name+1) erhalten.

Die Verzeichnisstruktur könnten dann so aussehen:
Urlaub10
Urlaub10_1
Urlaub10_2
Urlaub10_3
Spiele
Bilder
Test

Ich habe bereits einen Code geschrieben, aber ich komme nicht an die letzten 10% heran. Jedoch konnte ich bereits mit substr_count die nötigen Information herausholen die ich brauche, aber leider in folgender Form: 1111000.

Jetzt müsste ich nur noch die Einsen zusammenzählen und eine Eins dazu addieren und mein Problem wäre gelöst, aber genau daran scheitere ich, kann mir da jemand helfen, danke.

Der bisheriege Code:

  
if (is_dir('./images/'.$addCatName_p3)) {  
  $handle = opendir('./images');  
  $i=0;  
  while ($dir = readdir($handle)) {  
    if ($dir != '..' && $dir != '.') {  
      $array_dir = array();  
      $array_dir[$i++] = $dir;  
      //array_keys($array_dir, $addCatName_p3);  
      //echo $found = array_search($addCatName_p3, $array_dir);  
      //print_r($array_dir);  
      //echo $anz = substr_count($array_dir, $addCatName_p3);  
      //mkdir('./images/'.$addCatName_p3.'_'.$anz+1);  
      foreach ($array_dir as $key) {  
        //$key;echo count($key);  
        //echo $key;  
        echo $anz_key = substr_count($key, $addCatName_p3);  
        //echo $anz_num = substr_count($anz_key, '1');  
      }  
    }  
  }  
} else echo "ok"; mkdir('./images/'.$addCatName_p3);  

  1. Grüße,
    ich weiss nciht ob es performanter wäre (je nachdem ob du viele "folgeordner" haben wirst), aber codemäßig wärest du besser dran zu überprüfen ob "name_"+i ein ordner ist, mit increment bei i.
    MFG
    bleicher

    --
    __________________________-

    FirefoxMyth
  2.   
    <?php  
    function makeDirName($name) {  
        $dirs = glob($name . '*', GLOB_ONLYDIR);  
        if (!count($dirs)) return $name;  
        return $name . '_' . (ltrim(strstr(max($dirs), '_'), '_') + 1);  
    }  
      
    echo makeDirName('./images/Urlaub10');  
      
    
    

    1. Hello,

      <?php
      function makeDirName($name) {
          $dirs = glob($name . '*', GLOB_ONLYDIR);
          if (!count($dirs)) return $name;
          return $name . '' . (ltrim(strstr(max($dirs), ''), '_') + 1);
      }

      echo makeDirName('./images/Urlaub10');

        
        
      Wobei dies nur von der Grundidee her richtig ist, aber nicht zuemnde gedacht.  
      Siehe meinen Einwand in <https://forum.selfhtml.org/?t=199746&m=1344865>  
        
      Im Wettbewerb der konnkurrierendnen User könnte das nämlich schiefgehen.  
      Zwischen das Auslesen mit GLOB incl. Prüfung und das anschließende Anlegen passen noch hunderte Requests anderer User.  
        
        
        
        
        
        
      Liebe Grüße aus dem schönen Oberharz  
        
        
      Tom vom Berg  
      ![](http://selfhtml.bitworks.de/Virencheck.gif)  
        
      
      -- 
       ☻\_  
      /▌  
      / \ Nur selber lernen macht schlau  
      <http://bergpost.annerschbarrich.de>
      
    2. Hi!

      function makeDirName($name) {
          $dirs = glob($name . '*', GLOB_ONLYDIR);
          if (!count($dirs)) return $name;
          return $name . '' . (ltrim(strstr(max($dirs), ''), '_') + 1);
      }

        
      Falsch, weil  
        
        var\_dump(max(array('x1', 'x9', 'x10')));  
        
      x9 liefert und nicht x10. Hier benötigte man eine so genannte natürliche Sortierung, die Zahlenbestandteile als solche und nicht als einzelne Zeichen wertet.  
        
        
      Lo!
      
  3. Hello,

    das kannst Du auch ganz brutal lösen. Das hat sogar den Vorteil, dass Du Dir kein TOCTOU-Problem baust.
    http://en.wikipedia.org/wiki/Time-of-check-to-time-of-use
    (Neuerdings mit 'TT' in der Mitte *gg*)

      
    <?php   ### make_dir.php ### Verzeihnis anlegen, Alternativnamen bilden  
      
    error_reporting(E_ALL);  
    ini_set('track_errors',1);  
    define ('CATEXISTS','file exists');  
      
    $catname = 'tommies_ordner';  
    $index = '';  
      
    while (false === mkdir('./images/'.$catname.(($index > 0)?"_$index":''))  
           and strpos(strtolower($php_errormsg), CATEXISTS) !== 0)  
    {  
       $index++;  
    }  
      
    $dir = glob('./images/*',GLOB_ONLYDIR);  
      
    echo "<pre>\r\n";  
    echo htmlspecialchars(print_r($dir,1));  
    echo "</pre>\r\n";  
      
    ?>  
      
    
    

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hello,

      while (false === mkdir('./images/'.$catname.(($index > 0)?"_$index":''))

      hier wäre jetzt vielelicht auch ausnahmsweise ein @mkdir erlaubt, da der Fehler von mkdir selber abgefangen wird. Aber man könnte diese Fehlermeldung im Produktivbetrieb auch generell abschalten bzw. (auch im Entwicklungsbetrieb) umleiten in eine Datei.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Hi!

        while (false === mkdir('./images/'.$catname.(($index > 0)?"_$index":''))
        hier wäre jetzt vielelicht auch ausnahmsweise ein @mkdir erlaubt, da der Fehler von mkdir selber abgefangen wird. Aber man könnte diese Fehlermeldung im Produktivbetrieb auch generell abschalten bzw. (auch im Entwicklungsbetrieb) umleiten in eine Datei.

        Da dieser Fehler beabsichtigt ist, ist ein @ durchaus angebracht. Man kann ja keine Fehler(typen) einzeln abschalten. Entweder alle oder keinen (die Unterscheidung nach E_... ist zu grob). Alle zu ignorieren ist auch nicht so besonders toll. Und dieser Fehler soll weder die Datei mit den wichtigen Fehlern vollmüllen, noch im Entwicklungsbetrieb ständig den Bildschirm füllen. Also @ davor. Am besten noch kommentieren, dass das Absicht ist und wegen des TOCTTOU-Problems nicht auf vorhergehendes is_dir() umgeschrieben werden kann. Nicht dass ein "@-ist-böse-Fanatiker" hier was Gutes tun will und stattdessen ein nur schwer zu findendes Problem einbaut.

        Lo!

        1. Hello Dedlfix,

          Da dieser Fehler beabsichtigt ist, ist ein @ durchaus angebracht.

          Danke für die philosophische Unterstützung.

          Am besten noch kommentieren, dass das Absicht ist und wegen des TOCTTOU-Problems nicht auf vorhergehendes is_dir() umgeschrieben werden kann. Nicht dass ein "@-ist-böse-Fanatiker" hier was Gutes tun will und stattdessen ein nur schwer zu findendes Problem einbaut.

          Ja, Verschlimmbesserung ist oft die Folge mangelnder Dokumentation...

          Blöd wird es nur, wenn jemand einen eigenen Error-Handler einbaut oder sich einen solchen einschleppt mittels Include. Dann funktioniert mMn das Error-Tracking nicht mehr, das man hier braucht, um die Schleife sinnvoll zu steuern.

          Es gibt schließlich noch genügend andere Gründe, warum ein Verzeichnis nicht angelegt werden kann und die muss man dann unterscheiden können. Im Prinzip müssten die auch noch zu einem qualifizierten Fehlerwert führen, wenn man eine Funktion daraus machen sollte.

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de