# Grafiken laden, bearbeiten und in ein Magazin laden



## Alice (5. Februar 2012)

Hallo. 

Ich habe wieder eine Frage.


```
$ordner = './images/grafiken/';
```


```
$var = 'BMW500PS';
```

Ich suche eine Möglichkeit in einem Rutsch für jedes Zeichen in der Variable eine Grafik zu laden und in eine andere größere Grafik zu setzen. 

Beispiel:
1. Erstes Zeichen in $var als Grafik laden (B.png)
2. Die Dimensionen von "B.png" feststellen
3. Eine neue Grafik mit der Breite von "B.png" erstellen (die Höhe ist fest)
4. Eine Grafik (1px Breit - ist ein Background) in die neue Grafik kopieren und so oft (nach rechts) wiederholen bis alles voll ist
5. B.png in die neue Grafik kopieren (Koordinaten immer gleich)
6. Die neue Grafik muss nun als Variable verfügbar und nutzbar sein (nur im RAM)

Wenn es nur eine Grafik wäre (B.png) wäre es ja nicht so ein großes Problem für mich aber es sind ja mehrere Grafiken

B.png
M.png
W.png
5.png
0.png
0.png
P.png
S.png

Jemand eine Idee wie ich das umsetzen könnte?


----------



## Parantatatam (5. Februar 2012)

Schleife? Außerdem hast du doch schon selber den Algorithmus ausformuliert, denn du nur noch umsetzen musst.


----------



## Alice (5. Februar 2012)

Ja aber ich bekomme darauf keinen Code gebastelt.


----------



## ComFreek (5. Februar 2012)

```
$len = strlen($var);

for ( $i=0; $i<$len; $i++ )
{
  $curChar = $var[$i];

  // $curChar enthält nun entweder B, M, W, 5, 0, 0, P oder S
}
```


----------



## Parantatatam (5. Februar 2012)

Ist der Hintergrund immer gleich?


----------



## Parantatatam (5. Februar 2012)

@ComFreek: Das geht viel kürzer:

```
$curChar = str_split($var);
```


----------



## Alice (5. Februar 2012)

einfach nur crack hat gesagt.:


> Ist der Hintergrund immer gleich?



Ja die Hintergrund Grafik ist immer die selbe. Die Hintergrund kannst du dir vorstellen wie auf einer Webseite die sich solange widerholt bis alles ausgefüllt ist.

Im Skript muss die Hintergrund in der neuen Grafik (imagecreatetruecolor oder so) von links nach rechts eingefüllt werden.

Edit:

Hätte da noch ne Frage.

Wäre eine Funktion nicht sinnvoller? Vielleicht denke ich jetzt einfach nur falsch aber wäre es dann nicht evtl. möglich auch Grafiken anzusprechen die NICHT im selben Verzeichnis liegen? 

B.png (./images/lalala1/)
M.png (./images/lalala2/)
W.png (./images/lalala1/)


----------



## Parantatatam (5. Februar 2012)

Du kannst es vielleicht so lösen:

```
<?php
$letters = array(
  'B' => './images/lalala1/b.png',
  'M' => './images/lalala2/m.png',
  'W' => './images/lalala1/w.png',
);

$resources = array();

foreach($letters as $letter => $file) {
  $resources[$letter] = imagecreatefrompng($file);
}
```


----------



## Alice (5. Februar 2012)

Kann man dafür nicht besser eine Funktion bauen? Leider finde ich bei Google nichts ähnliches wie es brauche.


----------



## Parantatatam (5. Februar 2012)

Finde ich zwar unsinnig, aber wie du meinst:

```
<?php
$letters = array(
  'B' => './images/lalala1/b.png',
  'M' => './images/lalala2/m.png',
  'W' => './images/lalala1/w.png',
);

function load_resources(array $letters) {
  $resources = array();
  
  foreach($letters as $letter => $file) {
    $resources[$letter] = imagecreatefrompng($file);
  }
  return $resources;
}

load_resources($letters);
```


----------



## Alice (5. Februar 2012)

Das wird wohl doch ne ganze ecke schwieriger als ich dachte.

Die Code stelle am Anfang von deinem Beispiel "$letters = array();" verstehe ich schon einmal gar nicht.

Denn die Zeichen (Buchstaben und Zahlen) erhalte ich ja vom User in der Variable "$var = 'BMW500PS';".

Des Weiteren fällt mir keine Lösung ein wie ich Zahlen von Zahlen unterscheiden soll.

Beispiel:

Bmw500Ps

B -> großes B -> Ordner 1
m -> kleines m -> Ordner 2
w -> kleines w -> Ordner 2
5 -> Tja?
0 -> Tja?
0 -> Tja?
P -> großes P -> Ordner 1
s -> kleines s -> Ordner 2

Denn es gibt zwei verschiedene Arten von Zahlen im Skript. Also zwei verschiedene mögliche Grafiken.

Ich habe mir überlegt das der User ein Ausrufezeichen vor die Zahl schreiben muss um zu unterscheiden welches Zeichen er meint.

Beispiel: Bmw5!0!0PS

Die "5" wäre Ordner 1 und "!0" und !0" wären Ordner 2.

Aber das Skript erkennt ja jeweil nur EIN Zeichen in der Variable.

B.png
m.png
w.png
5.png
0.png
0.png
P.png
s.png

Deswegen dachte ich auch eine Funktion die all diese Sachen umsetzen kann. Das heisst jetzt nicht das ich auf einen fertigen Code von euch warte (was ich trotzdem immer gerne sehe  ) sondern eher Denkanstösse, Ideen, Links usw.


----------



## Parantatatam (5. Februar 2012)

Ich würde so gerne einmal mit Profis arbeiten!

```
$var = 'Bmw500PS';
$pattern = '/([a-z])|([A-Z])|([0-9])/';
if(preg_match_all($pattern, $var, $matches) !== false) {
  $count  = count($matches[0]);
  foreach($matches[0] as $i => $letter) {
    # Kleinbuchstabe
    if(!empty($matches[1][$i])) {
      $result[] = array($letter, 0);
    # Großbuchstabe
    } elseif(!empty($matches[2][$i])) {
      $result[] = array($letter, 1);
    # Ziffer
    } else {
      $result[] = array($letter, 2);
    }
  }
} else {
  $result = array();
}
```


----------



## Alice (5. Februar 2012)

einfach nur crack hat gesagt.:


> Ich würde so gerne einmal mit Profis arbeiten!



Wir können zusammen jedes Auto reparieren, tunen oder evtl. sogar bauen. Ich kann bei dir auch die Buchhaltung schmeißen. Aber PHP, nach da kann ich nicht viel.

Edit:

Hast du denn evtl. auch eine Idee wie ich Zahlen unterscheiden könnte? Also z.B. 5!0!0 (5 !0 !0) statt 500.


----------



## Parantatatam (5. Februar 2012)

Das erledigt mein Skript bereits.


----------



## Alice (5. Februar 2012)

Achso. 

Und wie unterscheidet das Skript die Zahlen?

Wenn ich es mit

```
$var = 'Bmw500PS';
```
ausführe und ausgebe (prinz) erscheint folgendes:

```
Array
(
    [0] => Array
        (
            [0] => B
            [1] => 1
        )

    [1] => Array
        (
            [0] => m
            [1] => 0
        )

    [2] => Array
        (
            [0] => w
            [1] => 0
        )

    [3] => Array
        (
            [0] => 5
            [1] => 2
        )

    [4] => Array
        (
            [0] => 0
            [1] => 2
        )

    [5] => Array
        (
            [0] => 0
            [1] => 2
        )

    [6] => Array
        (
            [0] => P
            [1] => 1
        )

    [7] => Array
        (
            [0] => S
            [1] => 1
        )

)
```

Wenn ich es aber mit

```
$var = 'Bmw50!0PS';
```
ausführe und ausgebe (print) erscheint folgendes:

```
Array
(
    [0] => Array
        (
            [0] => B
            [1] => 1
        )

    [1] => Array
        (
            [0] => m
            [1] => 0
        )

    [2] => Array
        (
            [0] => w
            [1] => 0
        )

    [3] => Array
        (
            [0] => 5
            [1] => 2
        )

    [4] => Array
        (
            [0] => 0
            [1] => 2
        )

    [5] => Array
        (
            [0] => 0
            [1] => 2
        )

    [6] => Array
        (
            [0] => P
            [1] => 1
        )

    [7] => Array
        (
            [0] => S
            [1] => 1
        )

)
```

Also kein Unterschied?


----------



## Parantatatam (5. Februar 2012)

Was willst du denn mit dem Ausrufezeichen erreichen? Ansonsten: erster Wert im Array: das Zeichen, zweiter Wert im Array: 0 => Kleinbuchstabe, 1 => Großbuchstabe, 2 => Ziffer


----------



## Alice (5. Februar 2012)

einfach nur crack hat gesagt.:


> Was willst du denn mit dem Ausrufezeichen erreichen?



Also nehmen wir an der User hat "Bmw50!0Ps" eingegeben.

Dann soll folgendes passieren:

B -> Ordner 1 -> B.png
m -> Ordner 2 -> m.png
w -> Ordner 2 -> w.png

5  -> Ordner 1 -> 5.png
*0  -> Ordner 1 -> 0.png*
*!0  -> Ordner 2 -> 0.png* // Wenn möglich soll das Skript hier erkennen das diese Null (wegen dem Ausrufezeichen davor) ein "kleiner Buchstabe" ist sozusagen. 

P -> Ordner 1 -> P.png
s -> Ordner 2 -> s.png

Oder gibt es noch eine andere Möglichkeit das "automatisch" erkannt wird das die "0" aus einem anderen Verzeichnis geladen werden soll?


----------



## Lime (5. Februar 2012)

Was soll das bringen, Zahlen zu unterscheiden****?
Du willst doch hoffentlich nicht die Bilder für Zahlen bis 10.000 anfertigen und abspeichern?

Klein- und Großbuchstaben sind verständlich, aber kleine Zahlen****
€: wieso zensiert der zwei-, drei- und vierfaches Fragezeichen^^


----------



## Parantatatam (5. Februar 2012)

Du könntest sagen, dass jede zweite Null oder jede letzte Null als kleine Null dargestellt werden soll, aber wenn es dafür keine Regeln gibt, dann musst du das beispielsweise mit deinem Ausrufezeichen lösen.


----------



## Alice (5. Februar 2012)

Was das bringen soll?

Einfaches Beispiel:
Die Grafiken in Ordner 1 sind Blau.
Die Grafiken in Ordner 2 sind Rot.

Und der User soll ja dann entscheiden welche Farbe der Buchstabe oder die Zahl haben soll.

Kannst du deinen Code nicht um diese Eigenschaft erweitern?


----------



## Parantatatam (5. Februar 2012)

```
$var = 'Bmw500PS';
$pattern = '/([a-z])|([A-Z])|(![0-9])|([0-9])/';
if(preg_match_all($pattern, $var, $matches) !== false) {
  $count  = count($matches[0]);
  foreach($matches[0] as $i => $letter) {
    # Kleinbuchstabe
    if(!empty($matches[1][$i])) {
      $result[] = array($letter, 0);
    # Großbuchstabe
    } elseif(!empty($matches[2][$i])) {
      $result[] = array($letter, 1);
    # Ziffer mit Ausrufezeichen davor
    } elseif(!empty($matches[3][$i])) {
      $result[] = array(substr($letter, 1), 2);
    # einfache Ziffer
    } else {
      $result[] = array($letter, 3);
    }
  }
} else {
  $result = array();
}
```


----------



## Alice (5. Februar 2012)

Super jetzt geht es! 


```
Array
(
    [0] => Array
        (
            [0] => B
            [1] => 1
        )

    [1] => Array
        (
            [0] => m
            [1] => 0
        )

    [2] => Array
        (
            [0] => w
            [1] => 0
        )

    [3] => Array
        (
            [0] => 5
            [1] => 2
        )

    [4] => Array
        (
            [0] => 0
            [1] => 3
        )

    [5] => Array
        (
            [0] => 0
            [1] => 3
        )

    [6] => Array
        (
            [0] => P
            [1] => 1
        )

    [7] => Array
        (
            [0] => S
            [1] => 1
        )

)
```

Danke! 

Jetzt muss ich nur noch herausfinden wie ich die Verzeichnisse damit lenke.


----------



## Alice (7. Februar 2012)

Hallo, ich hätte da noch eine Frage zu deinem Code. 



einfach nur crack hat gesagt.:


> ```
> $var = 'Bmw500PS';
> $pattern = '/([a-z])|([A-Z])|(![0-9])|([0-9])/';
> if(preg_match_all($pattern, $var, $matches) !== false) {
> ...



Ich habe es nun so gemacht das in deinem Code eine neue Variable erstellt wird mit einem Teil-Pfad.

Beispiel:

```
# Kleinbuchstabe
if(!empty($matches[1][$i])) {
   $result[] = array($letter, $Teil_Pfad = 'arial_font_bold';);
} 

# Großbuchstabe
elseif(!empty($matches[2][$i])) {
   $result[] = array($letter, $Teil_Pfad = 'arial_font_normal';);
}
```

Wie kann ich denn jetzt "$Teil_Pfad" richtig verwenden? Mit $result geht es nicht.


----------



## Parantatatam (7. Februar 2012)

Was willst du denn damit erreichen? Sollen die Zeichenkette konkatiniert werden oder soll $Teil_Pfad der Schlüssel von den Werten sein?


----------



## Alice (7. Februar 2012)

Ich raff das ganze einfach überhaupt nicht. Ich versuche es mal zu erklären in einfachen Worten.

1. User gibt etwas in ein Formular ein und schickt es ab
2. Das Skript muss nun die Eingabe des User Zeichen für Zeichen einer Schriftart zuordnen
3. Die Grafiken werden in einer Schleife erstellt und dann in eine größere Grafik gespeichert
4. Fertig

In meinem "Anfänger-Skript" habe ich so etwas wie eine "Verzeichniss-Ebene" erstellt.


```
Die Variable "$pfad_font" wird bisher durch eine ganz einfach IF-Abfrage ausgesucht.

Sind mehr als 5 Zeichen in der Variable dann "Arial_Font_Normal" sonst "Arial_Font_Bold".

$Pfad_1 = './';
$Pfad_2 = 'images/';
$Pfad_3 = 'sig';
$Pfad_4 = $pfad_font;
$format = '.png';
```

Ich möchte nun das Skript erweitern so das jedes Zeichen in der Variable seinen eigenen Pfad bekommt.

Später im Skript wenn die Grafiken geladen werden (imagecreate...) sollen die Grafiken individuell (nicht starr wie jetzt) geladen werden können.

Bei Bedarf stell ich mal einen 1:1 Code zur Verfügung.


----------



## Parantatatam (7. Februar 2012)

Um ehrlich zu sein: ein klarer Fall für Klassen. Aber das mach' ich morgen.


----------



## Alice (7. Februar 2012)

Klassen? Ist das wieder etwas neues?

Hier mal das Skript aber sehr stark vereinfacht, da es sonst viel zu unübersichtlich ist.


```
// ### Variable usw. ### //
   $U_Eingabe = "BMW500PX";
   $U_Eingabe = htmlspecialchars($U_Eingabe, ENT_QUOTES);
   $U_Eingabe = htmlspecialchars($U_Eingabe);

// ### Grundeinstellungen ### //
   $format = '.png';

// ### Prüfen ob leer ### //
   if (strlen($U_Eingabe) == '0') {
      unset($U_Eingabe);
      echo '<div style="text-align:center; font-weight:bold;">Error</div><br />';
   } 

// ### Zeichen zählen ### //
   $Zeahlen = strlen($U_Eingabe);

// ### Schrift auswählen (Starr) ### //
   if ($Zeahlen < 5) {
       $Schrift = 'Arial_Font_Normal';
   }
       else
   {
       $Schrift = 'Arial_Font_Bold';
   }


// ### Verzeichniss-Ebene ### //
   $Pfad_1 = './';
   $Pfad_2 = 'images/';
   $Pfad_3 = 'sig';
   $Pfad_4 = $Schrift;

// ### Verzeichniss Zusammenfassem ### //
   $Pfad_complete = $Pfad_1.$Pfad_2.$Pfad_3.$Schrift;

// ### Grafiken erstellen ### //
   for($j=0, $x = strlen($U_Eingabe); $j < $x; ++$j){ 
      if(file_exists($Pfad_complete.$U_Eingabe[$j].$format){
         $size = getimagesize($Pfad_complete.$U_Eingabe[$j].$format);
         $im[] = array('img' => imagecreatefrompng($Pfad_complete.$U_Eingabe[$j].$format), 'sizex' => $size[0],); 
         $total_size_x +=$size[0]; 
      } 
   } 

// ### abschluss ### //
   $image = imagecreatetruecolor($total_size_x, $size[1]);
   $ac_x  = 0;
            foreach($im as $grafik){ 
                   ImageCopyResampled($imend, $grafik['img'], $ac_x, 0, 0, 0, imagesx($grafik['img']), imagesy($grafik['img']), imagesx($grafik['img']), imagesy($grafik['img']));
                   $ac_x+= $grafik['sizex']; 
            }

   imagepng($image);
```


----------



## Parantatatam (8. Februar 2012)

Klassen: http://de3.php.net/manual/de/language.oop5.basic.php


----------



## Alice (8. Februar 2012)

Das ist mir zu hoch. 

Vielleicht bin ich aber auch einfach zu müde.


----------



## Parantatatam (8. Februar 2012)

Meine Lösung würde jetzt so aussehen:

```
<?php
  class FontException extends Exception {}
  
  class Font {
    private static $fonts = array();
    private $name      = '';
    private $weight    = '';
    private $directory = '';
    private $letters   = array();
    public  $format    = 'png';
    
    public static function get($name, $weight = null, $directory = null) {
      if($weight === null) {
        $weight = 'normal';
      }
      
      if(self::$fonts === array()) {
        if($directory === null) {
          throw new FontException('directory required');
        }
        
        self::$fonts[] = new Font($name, $weight, $directory);
        return end(self::$fonts);
      } else {
        foreach(self::$fonts as $font) {
          if(($font->name === $name) && ($font->weight === $weight)) {
            return $font;
          }
        }
        
        if($directory === null) {
          throw new FontException('directory required');
        }
        
        self::$fonts[] = new Font($name, $weight, $directory);
        return end(self::$fonts);
      }
    }
    
    private function __construct($name, $weight, $directory) {
      if(!is_string($name) || !is_string($name) || !is_string($directory) || empty($name) || empty($weight) || empty($directory)) {
        throw new FontException('invalid arguments');
      } elseif(!file_exists($directory) || !is_dir($directory)) {
        throw new FontException('directory >>' . $directory . '<< does not exist');
      }
      
      $this->name      = strtolower($name);
      $this->weight    = strtolower($weight);
      $this->directory = $directory;
    }
    
    public function letter($letter) {
      if(isset($this->letters[$letter])) {
        return $this->letters[$letter];
      } elseif(file_exists($this->__toString() . $letter . '.' . $this->format) || ($size = getimagesize($this->__toString() . $letter . '.' . $this->format))) {
        switch($this->format) {
          case 'png':
            $this->letters[$letter] = array(
              imagecreatefrompng($this->__toString() . $letter . '.' . $this->format),
              $size,
            );
            break;
          case 'jpeg':
          case 'jpg':
            $this->letters[$letter] = array(
              imagecreatefromjpeg($this->__toString() . $letter . '.' . $this->format),
              $size,
            );
            break;
          case 'gif':
            $this->letters[$letter] = array(
              imagecreatefromgif($this->__toString() . $letter . '.' . $this->format),
              $size,
            );
            break;
          default:
            throw new FontException('invalid image format');
        }
      } else {
        throw new FontException('could not find the file for the character "' . $letter . '"');
      }
    }
    
    public function __toString() {
      return $this->directory . '/' . ucfirst($this->name) . '_Font_' . ucfirst($this->weight);
    }
  }
  
  
  if(isset($_POST['images']['submit'])) {
    try {
      if(($length = strlen($input = trim($_POST['images']['text']))) === 0) {
        throw new Exception('invalid input');
      }
      
      if($length < 5) {
        $font = Font::get('arial', null,   './images/sig');
      } else {
        $font = Font::get('arial', 'bold', './images/sig');
      }
      
      # set format of the character files
      $font->format = 'png';
      
      $letters = str_split($input);
      $size    = array(0, 0);
      
      foreach($letters as $i => $letter) {
        $letters[$i] = $letter = $font->letter($letter);
        $size[0]    += $letter[0][0];
        $size[1]     = ($letter[0][1] > $size[1]) ? $letter[0][1] : $size[1];
      }
      
      $image      = imagecreatetruecolor($size[0], $size[1]);
      $position_x = 0;
      $imend; # hast du irgendwo definiert
      
      foreach($letters as $letter) {
        imagecopyresampled($imend, $letter[0], $position_x, 0, 0, 0, $letter[0][0], $letter[0][1], $letter[0][0], $letter[0][1]);
        $position_x += $letter[0][0];
      }
      
      header('Content-Type: image/png');
      imagepng($image);
    } catch(Exception $e) {
?>
<!DOCTYPE html>
<html>
<head>
  <title>Fehler aufgetreten</title>
</head>
<body>
  <div style="border:3px solid red"><?php echo $e->getMessage(); ?></div>
</body>
<?php
    }
  } else {
?>
<!DOCTYPE html>
<html>
<head>
  <title>Bild erstellen</title>
</head>
<body>
  <form id="images" method="post" action="">
    <label for="images-text"><input id="images-text" name="images[text]" type="text" /><br />
    <input id="images-submit" name="images[submit]" type="submit" value="erstellen" />
  </form>
</body>
<?php
  }
?>
```


----------



## Alice (8. Februar 2012)

Ach du Sche****!  Danke! Da muss ich aber erst mit klar kommen.


----------



## Alice (8. Februar 2012)

bl5000 hat gesagt.:


> Wie kann ich denn jetzt "$Teil_Pfad" richtig verwenden? Mit $result geht es nicht.





einfach nur crack hat gesagt.:


> Was willst du denn damit erreichen? Sollen die Zeichenkette konkatiniert werden oder soll $Teil_Pfad der Schlüssel von den Werten sein?



In deinen neuen Code muss ich mich erst einmal reinarbeiten. Das kann ein paar tage dauern.

Ich versuche noch immer "$result" oder "$Teil_Pfad" zu verwenden.

Jedoch lässt sich der Array nicht ausgeben. Nur mit "Print" funktioniert es.


----------



## Parantatatam (8. Februar 2012)

Welcher Array?


----------



## Alice (8. Februar 2012)

```
$var1 = 'FCBayern'; // Beispiel

$pattern = '/([a-z])|([A-Z])/';
if(preg_match_all($pattern, $var1, $matches) !== false) {
$count = count($matches[0]);
foreach($matches[0] as $i => $letter) {
   if(!empty($matches[1][$i])) {
      $result[] = array($letter, 'arial_normal');
   }
   elseif(!empty($matches[2][$i])) {
      $result[] = array($letter, 'arial_bold');
   }
}
} 
else  {
$result = array();
}

$pfad1 = './images/';
$pfad2 = './sig/';
$pfad3 = './schrift/';
$pfad4 = ARRAY // Hier soll dann halt "arial_normal" oder "arial_bold" rein. Für jedes Zeichen individuell
$pfad5 = './blau/';

...

for($j=0, $x = strlen($var1); $j < $x; ++$j){ 
      if(file_exists($pfad1.$pfad2.$pfad3.$pfad4.$pfad5.$Input2[$j].'.png')){
         $size = getimagesize($pfad1.$pfad2.$pfad3.$pfad4.$pfad5.$Input2[$j].'.png');
         $image[] = array('image' => imagecreatefrompng($pfad1.$pfad2.$pfad3.$pfad4.$pfad5.$Input2[$j].'.png'), 'sizex' => $size[0],); 
         $total_size_x +=$size[0]; 
      } 
}
```

Meine Frage bezieht sich auf "$pfad4". Egal was ich dort eintrage, es funktioniert nicht. Ich denke aber das es auch so nicht funktionieren KANN. Denn jedes Zeichen hat ja seinen eigenen Pfad.......... also das ist das Ziel.


----------



## Parantatatam (8. Februar 2012)

Sollen die Zeichen alle in der gleichen Schriftart sein oder soll jedes Zeichen in einer eigenen Schriftart sein?


----------



## Alice (8. Februar 2012)

Ich hol mal etwas weiter aus um es besser zu erlären.

Die Schrift gibt es nicht als Schriftdatei auf dem Server. Die Ordner heissen zwar so aber es befinden sich ganz normale Grafiken drin. Die Grafiken zeigen halt die Schrift Arial Normal und Bold. 

Das ganze Skript ist FEST programmiert. Sprich alle Pfade usw. sind unveränderlich. Nun möchte ich mehr möglichkeiten in das Skript bauen.

Das wichtigste ist erst einmal das NICHT NUR Arial-Normal oder Arial-Bold verwendbar sind (in der Endgrafik) sondern beides.

Wenn du meinen Code etwas folgen kannst, dann solltest du sehen was ich meine.

Um deine Frage zu beantworten:
Jedes Zeichen soll in einer eigenen Schriftart sein.


----------



## Raisch (8. Februar 2012)

bl5000 hat gesagt.:


> Meine Frage bezieht sich auf "$pfad4". Egal was ich dort eintrage, es funktioniert nicht. Ich denke aber das es auch so nicht funktionieren KANN. Denn jedes Zeichen hat ja seinen eigenen Pfad.......... also das ist das Ziel.


Ich weiß zwar nicht warum Du das mit dem Pfad da so komisch machst, aber teste es mal damit:

```
$pfad = array(
    './images/',
    './sig/',
    './schrift/',
    $result,
    './blau/'
);

for( $i = 0, $x = strlen( $var1 ); $i < $x; $i++ )
{
    $file = $pfad[0] . $pfad[1] . $pfad[2] . $pfad[3][$i] . $pfad[4] . $Input2[$i] . '.png';
    if( is_file( $file ) )
    {
        $size = getimagesize( $file );
        $image[] = array( 'image' => imagecreatefrompng( $file ), 'sizex' => $size[0] );
        $total_size_x += $size[0];
    }
}
```

Gruß


----------



## Alice (8. Februar 2012)

Geht leider nicht. Es wird immer noch bei dem Pfad für die Schriftart "Array" eingesetzt.


----------



## Raisch (8. Februar 2012)

bl5000 hat gesagt.:


> Geht leider nicht. Es wird immer noch bei dem Pfad für die Schriftart "Array" eingesetzt.


Ist ja auch klar.  Hab nicht gesehen, dass Du da im Array noch einen Array speicherst.

Änder dann mal noch:

```
if(!empty($matches[1][$i])) { 
      $result[] = array($letter, 'arial_normal'); 
   } 
   elseif(!empty($matches[2][$i])) { 
      $result[] = array($letter, 'arial_bold'); 
   }
```
in

```
if(!empty($matches[1][$i])) { 
      $result[] = 'arial_normal'; 
   } 
   elseif(!empty($matches[2][$i])) { 
      $result[] = 'arial_bold'; 
   }
```

Gruß


----------



## Alice (8. Februar 2012)

Danke! Jetzt kann ich schon einmal verschiedene Ordner in einem Zug ansteuern.  Genau wie ich wollte.

Ich muss aber noch VIELE andere Codes umstellen.

Die nächste dämliche Frage ist also garantiert. 

DANKE JUNGS!


----------



## Raisch (8. Februar 2012)

bl5000 hat gesagt.:


> Danke! Jetzt kann ich schon einmal verschiedene Ordner in einem Zug ansteuern.  Genau wie ich wollte.
> 
> Ich muss aber noch VIELE andere Codes umstellen.
> 
> ...


Es gibt keine dämlichen Fragen (_naja ok, eigentlich schon_), nur dämliche Antworten!

Gruß


----------



## Alice (8. Februar 2012)

Obowhl eine Frage habe ich zu diesem Thema noch.

Diesen Code:

```
if(!empty($matches[1][$i])) { 
      $result[] = array($letter, 'arial_normal'); 
   } 
   elseif(!empty($matches[2][$i])) { 
      $result[] = array($letter, 'arial_bold'); 
   }
```
werde ich in meinem Skript mehrmals verwenden aber natürlich zusammenhängend. Kann die Sortierung im Array irgendwie gestört werden?

Beispiel:

```
$var1 = "FcBayern20***2";

Rauskommen sollte ja:
arial_bold      // F
arial_normal  // c
arial_bold      // B 
arial_normal  // a
arial_normal  // y
arial_normal  // e
arial_normal  // r
arial_normal  // n
arial_normal  // 2
arial_normal  // 0
arial_bold      // 1
arial_normal  // 2
```

Muss ich da irgendwie aufpassen?


----------



## Raisch (8. Februar 2012)

bl5000 hat gesagt.:


> Obowhl eine Frage habe ich zu diesem Thema noch.
> 
> Diesen Code:
> 
> ...


Genaugenommen brauchst Du den Extraarray gar nicht:

```
if(!empty($matches[1][$i])) {  
      $result[] = array($letter, 'arial_normal');  
   }  
   elseif(!empty($matches[2][$i])) {  
      $result[] = array($letter, 'arial_bold');  
   }
```
So sollte das (_für meinen Codesnipsel_) reichen:

```
if(!empty($matches[1][$i])) {  
      $result[] = 'arial_normal';  
   }  
   elseif(!empty($matches[2][$i])) {  
      $result[] = 'arial_bold';  
   }
```

Desweiteren dürften die Zahlen bei deinem Pattern (_'/([a-z])|([A-Z])/'_) gar nicht gematched werden!

Nimm dieses Pattern, wenn Du die Zahlen _normal_ haben willst:

```
$pattern = '#([a-z0-9])|([A-Z])#';
```

Oder dieses, wenn Du die Zahlen _bold_ haben willst:

```
$pattern = '#([a-z])|([A-Z0-9])#';
```

Gruß


----------



## Alice (8. Februar 2012)

Raisch hat gesagt.:


> Nimm dieses Pattern, wenn Du die Zahlen _normal_ haben willst:
> 
> ```
> $pattern = '#([a-z0-9])|([A-Z])#';
> ...



Kannst du mir den Unterschied zwischen den beiden Pattern erklären?

Groß- und Kleinbuchstaben zu unterscheiden ist ja einfach aber wie kann man ohne extra Sonderzeichen oder so Zahlen unterscheiden?

Meine Pattern (im Beispiel nicht drin) werden Zahlen und Zahlen mit einem Ausrufezeichen davor unterschieden.

Beispiel:
5 = Normal
!5 = Bold


----------



## Alice (9. Februar 2012)

Raisch hat gesagt.:


> So sollte das (_für meinen Codesnipsel_) reichen:
> 
> ```
> if(!empty($matches[1][$i])) {
> ...



Ich bekomme es leider nicht zum laufen.


```
$pattern = '/([a-z])|([A-Z])|(![0-9])|([0-9])/';

...

         if(!empty($matches[1][$i])) {
            $Arial_Font[] = 'Arial_Normal';
         }

         elseif(!empty($matches[2][$i])) {
            $Arial_Font[] = 'Arial_Bold';
         }

         elseif(!empty($matches[3][$i])) {
            $Arial_Font[] = substr($zeahler, 1).'Arial_Normal';
         }
            else 
         {
            $Arial_Font[] = 'Arial_Bold';
         }

...
```

Bei 
	
	
	



```
elseif(!empty($matches[3][$i])) {
```
 sollen die Zahlen mit Ausrufezeichen davor erkannt werden.


----------



## Raisch (9. Februar 2012)

Poste mal bitte das gesamte Skript wie es jetzt ist.


----------



## Alice (9. Februar 2012)

So sieht das ganze aus:

```
$var1 = 'BmW50!0ps';



   $pattern = '/([a-z])|([A-Z])|(![0-9])|([0-9])/';

   if(preg_match_all($pattern, $var1, $matches) !== false) {
      $count = count($matches[0]);
      foreach($matches[0] as $z => $zeahler) {
         if(!empty($matches[1][$i])) {
            $Arial_Font[] = 'Arial_Normal';
         }
         elseif(!empty($matches[2][$i])) {
            $Arial_Font[] = 'Arial_Bold';
         }
         elseif(!empty($matches[3][$i])) {
            $Arial_Font[] = substr($zeahler, 1).'Arial_Normal';
         }
            else 
         {
            $Arial_Font[] = 'Arial_Bold';
         }
      }
   } 
      else 
   {
      $Arial_Font[] = array();
   }
```


----------



## Raisch (9. Februar 2012)

Änder mal 
	
	
	



```
foreach($matches[0] as $z => $zeahler) {
```
 in 
	
	
	



```
foreach($matches[0] as $i => $zeahler) {
```
 um.

Du schreibst in der Foreachschleife _as $z_ benutzt aber _$i_.

Gruß

//EDIT
Das 
	
	
	



```
$count = count($matches[0]);
```
 kannst Du löschen da Du es nirgens benutzt.


----------



## Alice (9. Februar 2012)

Ist dieser Teil denn richtig?


```
elseif(!empty($matches[3][$i])) {
            $Arial_Font[] = substr($zeahler, 1).'Arial_Normal';
         }
```

Das Ausrufezeichen hat NUR die Fubktion zum erkennen der Schriftart. Danach wird es NICHT mehr gebraucht.


----------



## Raisch (9. Februar 2012)

bl5000 hat gesagt.:


> Ist dieser Teil denn richtig?
> 
> 
> ```
> ...


Ich kann Dir nicht sagen ob der Teil richtig ist, weil ich nicht genau weiß was Du damit erreichen willst.

Tu mir mal einen Gefallen, poste mal das gesamte Skript. Auch den Teil mit dem Pfad, halt mal alles. Dann sehe ich mal wie die einzelnen Teile zusammenspielen (_sollen_).

Gruß


----------



## Alice (9. Februar 2012)

Das sind 3000 Zeilen Code, wovon der Großteil nur kleinere Nebenaufgaben erfüllt.

Der Nachfolgende Code (von oben) soll folgendes machen.

In der Variable "$var1" befindet sich der Text "BmW50!0ps" der von einem User eingegeben wurde.

Normalerweise lautet der Text einfach nur "BMW500PS" aber der User möchte bei anderer Schreibweise eine andere Schrift benutzen (Schriftart oder Farbe... egal)


```
$var1 = 'BmW50!0ps';



   $pattern = '/([a-z])|([A-Z])|(![0-9])|([0-9])/';

   if(preg_match_all($pattern, $var1, $matches) !== false) {
      $count = count($matches[0]);
      foreach($matches[0] as $z => $zeahler) {
         if(!empty($matches[1][$i])) {
            $Arial_Font[] = 'Arial_Normal';
         }
         elseif(!empty($matches[2][$i])) {
            $Arial_Font[] = 'Arial_Bold';
         }
         elseif(!empty($matches[3][$i])) {
            $Arial_Font[] = substr($zeahler, 1).'Arial_Normal';
         }
            else 
         {
            $Arial_Font[] = 'Arial_Bold';
         }
      }
   } 
      else 
   {
      $Arial_Font[] = array();
   }
```

Bei "$matches[1]" wird die Variable auf kleine Zeichen geprüft. Also kleingeschriebe Buchstaben. Bei Treffer wird "Arial_Normal" verwendet.

Bei "$matches[2]" wird die Variable auf große Zeichen geprüft. Also Großgeschriebene Buchstaben. Bei Treffer wird "Arial_Bold" verwendet.

Bei "$matches[3]" wird die Variable auf Zahlen mit einem AUSRUFEZEICHEN davor geprüft. Bei Treffer wird "Arial_Normal" verwendet.

Bei "$matches[4]" (hier nur else) wird die Variable auf Zahlen geprüft. Bei Treffer wird "Arial_Bold" verwendet.

Was am ende rauskommt (soll******) ist:

```
$var1 = 'BmW50!0ps';

B -> Arial_Bold
m -> Arial_Normal
W -> Arial_Bold
5 -> Arial_Bold
0 -> Arial_Bold
!0 -> Arial_Normal
p -> Arial_Normal
s -> Arial_Normal
```

Wenn später die Grafiken geladen werden, weiss das Skript anhand dieses Codes in welchen Ordner es die Grafik findet.

Entweder:
/images/sig/font_grafik/*Arial_Bold*/blue/
oder
/images/sig/font_grafik/*Arial_Norma*l/blue/


----------



## Raisch (9. Februar 2012)

Das hier bringt das gewünschte Ergebnis:

```
$var1 = 'BmW50!0ps';

$pattern = '/([a-z]|![0-9])|([A-Z0-9])/';

if(preg_match_all($pattern, $var1, $matches) !== false) {
    $count = count($matches[0]);
    foreach($matches[0] as $i => $zeahler) {
        if(!empty($matches[1][$i])) {
            $Arial_Font[] = 'Arial_Normal';
        }
        elseif(!empty($matches[2][$i])) {
            $Arial_Font[] = 'Arial_Bold';
        }
        else
        {
            $Arial_Font[] = 'Arial_Bold';
        }
    }
}
else
{
    $Arial_Font[] = array();
}

echo '<pre>';
print_r( $Arial_Font );
echo '<pre>';
```

Gruß


----------



## Alice (9. Februar 2012)

Ja! Es funktioniert!


----------



## Alice (9. Februar 2012)

Nicht sauer werden! Aber was muss ich am Code verändern, wenn ich statt kleine Buchstaben zum erkennen von der richtigen Schrift, einfach auch hier wieder das Ausrufezeichen verwende?

$var1 = 'BmW50!0ps'

B*!M*W50*!0**!P**!S*


----------



## Raisch (9. Februar 2012)

bl5000 hat gesagt.:


> Nicht sauer werden! Aber was muss ich am Code verändern, wenn ich statt kleine Buchstaben zum erkennen von der richtigen Schrift, einfach auch hier wieder das Ausrufezeichen verwende?
> 
> $var1 = 'BmW50!0ps'
> 
> B*!M*W50*!0**!P**!S*


Dazu brauchst Du nur das Pattern ändern:

```
$pattern = '#(![a-z0-9])|([a-z0-9])#i';
```
Das _i_ am Ende steht für _case insensitive_.

Gruß


----------



## Alice (9. Februar 2012)

Müssen die Buchstaben "a-z" nicht Großgeschrieben werden? Ich möchte ja erreichen das im Skript alle Buchstaben immer Großgeschreiben werden.


----------



## Raisch (9. Februar 2012)

bl5000 hat gesagt.:


> Müssen die Buchstaben "a-z" nicht Großgeschrieben werden? Ich möchte ja erreichen das im Skript alle Buchstaben immer Großgeschreiben werden.


Schau mal hier!

Gruß


----------



## Alice (10. Februar 2012)

Durch meine Dummheit habe ich zu einem eigentlich in diesem Thread gehörenden Frage extra einen neuen Thread erstellt.

http://www.tutorials.de/php/384849-zeichen-string-einfuegen.html

Ich habe nun die Variable "$var1" so weit bearbeitet das ich damit weiter machen kann.

Im nächsten und letzten Schritt, möchte ich nun mit dem Code von @Raisch (danke noch einmal) neben Buchstaben und Zahlen auch den @-Zeichen einen Pfad zuweisen.


```
$var1 = 'B@m@W@5@0@!0@p@s';
 
$pattern = '/([a-z]|![0-9])|([A-Z0-9])/';
 
if(preg_match_all($pattern, $var1, $matches) !== false) {
    $count = count($matches[0]);
    foreach($matches[0] as $i => $zeahler) {
        if(!empty($matches[1][$i])) {
            $Arial_Font[] = 'Arial_Normal';
        }
        elseif(!empty($matches[2][$i])) {
            $Arial_Font[] = 'Arial_Bold';
        }
        else
        {
            $Arial_Font[] = 'Arial_Bold';
        }
    }
}
else
{
    $Arial_Font[] = array();
}
 
echo '<pre>';
print_r( $Arial_Font );
echo '<pre>';
```

Die @-Zeichen sollen wie die normalen Buchstaben und Zahlen erkannt werden und ihren eigenen Pfad bekommen wie z.B. Arial_Normal oder Arial_Bold.


----------



## Raisch (10. Februar 2012)

bl5000 hat gesagt.:


> Durch meine Dummheit habe ich zu einem eigentlich in diesem Thread gehörenden Frage extra einen neuen Thread erstellt.
> 
> http://www.tutorials.de/php/384849-zeichen-string-einfuegen.html
> 
> ...


Befasse dich aber wirklich mal mit regulären Ausdrücken.

```
$var1 = 'BmW50!0ps'; 
  
$pattern = '/([a-z]|![0-9])|([A-Z0-9])|(@)/'; 
  
if(preg_match_all($pattern, $var1, $matches) !== false) { 
    $count = count($matches[0]); 
    foreach($matches[0] as $i => $zeahler) { 
        if(!empty($matches[1][$i])) { 
            $Arial_Font[] = 'Arial_Normal'; 
        } 
        elseif(!empty($matches[2][$i])) { 
            $Arial_Font[] = 'Arial_Bold'; 
        } 
        elseif(!empty($matches[3][$i])) { 
            $Arial_Font[] = 'hier_pfad_für_@'; // @ matches
        }
        else 
        { 
            $Arial_Font[] = 'Arial_Bold'; 
        } 
    } 
} 
else 
{ 
    $Arial_Font[] = array(); 
} 
  
echo '<pre>'; 
print_r( $Arial_Font ); 
echo '<pre>';
```

Gruß


----------



## Alice (10. Februar 2012)

Mein aktuelles "Pattern" sieht so aus:

```
$pattern = '#(![A-Z0-9ÄÖÜ])|([A-Z0-9ÄÖÜ])#i';
```

Soll ich nun das neue von dir verwenden oder wie? Die sehen ja grundsätzlich verschieden aus.


```
$pattern = '/([a-z]|![0-9])|([A-Z0-9])/';
```

Kannst du bitte zum Abschluss dieses Threads das erste Pattern (oben) um das @-Zeichen erweitern?


----------



## Raisch (10. Februar 2012)

```
$pattern = '#(![A-Z0-9ÄÖÜ])|([A-Z0-9ÄÖÜ])|(@)#';
```
Da Du ja nur Großbuchstaben willst, habe ich mal den _i_-Modifier raus genommen.

Gruß


----------



## Alice (10. Februar 2012)

Funktioniert perfekt! 

Danke!


----------



## Alice (16. Februar 2012)

Hallo Zusammen. 

Dank eurer super Hilfe habt ihr mir ja diesen Code erstellt damit die einzelnen Zeichen in der Variable eine eigene Schrift zugeordnet bekommen.


```
$var1 = 'BMW50!0ps'; 
 
$pattern = '#(![A-Z0-9ÄÖÜ])|([A-Z0-9ÄÖÜ])|(@)#'; 
  
if(preg_match_all($pattern, $var1, $matches) !== false) { 
    $count = count($matches[0]); 
    foreach($matches[0] as $i => $zeahler) { 
        if(!empty($matches[1][$i])) { 
            $Arial_Font[] = 'Arial_Normal'; 
        } 
        elseif(!empty($matches[2][$i])) { 
            $Arial_Font[] = 'Arial_Bold'; 
        } 
        elseif(!empty($matches[3][$i])) { 
            $Arial_Font[] = 'hier_pfad_für_@'; // @ matches
        }
        else 
        { 
            $Arial_Font[] = 'Arial_Bold'; 
        } 
    } 
} 
else 
{ 
    $Arial_Font[] = array(); 
} 
  
echo '<pre>'; 
print_r( $Arial_Font ); 
echo '<pre>';
```

Der Code (oben) wird nur ausgeführt wenn der User die Option "Manuell" auswählt. Jetzt versuche ich die Option für "Autimatisch" zu basteln.


```
if ($wunsch_font == 'Automatisch') {
   $Arial_Font = array();
   $Arial_Font = str_repeat($Arial_Font[] = 'Arial_Normal',$var1);
}
```

Mein Code funktioniert jedenfalls nicht. Der Code sollte eigentlichen bewirken das dann für jeden Buchstaben und für jede Zahl die "Arial_Normal" verwendet wird.


----------



## ComFreek (16. Februar 2012)

Das kann nicht funktionieren, da der erste Parameter von [phpf]str_repeat[/phpf] ein String sein muss, der wiederholt wird - nicht eine Anweisung!

Du könntest z.B. folgendes stattdessen nehmen:

```
if ( $wunsch_font == 'Automatisch' )
{
  $Arial_Font = array();
  for ( $i=0; $i<$var; $i++ )
    $Arial_Font[] = 'Arial_Normal';
}
```


----------



## Alice (16. Februar 2012)

Der Code geht leider nicht.


----------



## Alice (16. Februar 2012)

Ok ich habe die Lösung SELBER gefunden.  


```
if ($wunsch_font == 'Automatisch') {
    $Arial_Font = array();
    for ($i=0; $i < strlen($var1); $i++)
    $Arial_Font[] = 'Arial_Normal';
}
```

Kann ich es eigentlich auch so machen?


```
if ($wunsch_font == 'Automatisch') {
    $Arial_Font = array();
    for ($i=0; $i < strlen($var1); $i++) {
          $Arial_Font[] = 'Arial_Normal';
    }
}
```


----------



## Alice (17. Februar 2012)

Ich habe da noch eine Frage zu diesem Code.


```
$var1 = 'BMW50!0ps'; 
 
$pattern = '#(![A-Z0-9ÄÖÜ])|([A-Z0-9ÄÖÜ])|(@)#'; 
  
if(preg_match_all($pattern, $var1, $matches) !== false) { 
    $count = count($matches[0]); 
    foreach($matches[0] as $i => $zeahler) { 
        if(!empty($matches[1][$i])) { 
            $Arial_Font[] = 'Arial_Normal'; 
        } 
        elseif(!empty($matches[2][$i])) { 
            $Arial_Font[] = 'Arial_Bold'; 
        } 
        elseif(!empty($matches[3][$i])) { 
            $Arial_Font[] = 'hier_pfad_für_@'; // @ matches
        }
        else 
        { 
            $Arial_Font[] = 'Arial_Bold'; 
        } 
    } 
} 
else 
{ 
    $Arial_Font[] = array(); 
} 
  
echo '<pre>'; 
print_r( $Arial_Font ); 
echo '<pre>';
```

Kann ich eigentlich auch den Code so erweitern das mehrere Pfade in verschiedene Arrays geladen werden? Oder kann das Probleme geben?


```
$var1 = 'BMW50!0ps'; 
 
$pattern = '#(![A-Z0-9ÄÖÜ])|([A-Z0-9ÄÖÜ])|(@)#'; 
  
if(preg_match_all($pattern, $var1, $matches) !== false) { 
    $count = count($matches[0]); 
    foreach($matches[0] as $i => $zeahler) { 
        if(!empty($matches[1][$i])) { 
            $Arial_Font[] = 'Arial_Normal'; 
            $groesse[] = '64'; 
        } 
        elseif(!empty($matches[2][$i])) { 
            $Arial_Font[] = 'Arial_Bold'; 
            $groesse[] = '32'; 
        } 
        elseif(!empty($matches[3][$i])) { 
            $Arial_Font[] = 'hier_pfad_für_@'; // @ matches
            $groesse[] = '64'; 
        }
        else 
        { 
            $Arial_Font[] = 'Arial_Bold'; 
            $groesse[] = '32'; 
        } 
    } 
} 
else 
{ 
    $Arial_Font[] = array(); 
} 
  
echo '<pre>'; 
print_r( $Arial_Font ); 
echo '<pre>';
```


----------



## timestamp (17. Februar 2012)

1) Wenn du mit foreach arbeitest, brauchst du $count nicht, das bräuchtest du nur für Forschleifen
2) Bei Schleifen und if kannst die die geschwungenen Klammern weglassen. Die Schleife/Bedindung gilt dann nur für die nächste Anweisung.
3) Das sollte eigentlich keine Probleme geben. Aber ich würde das ganze eigentlich mit Klassen lösen. Alternativ geht das dann auch mit Mehrdimensionalen Arrays (ist einfach schöner)


```
$Font = array();
foreach($matches[0] as $i => $zeahler) {  
  $Font[$i]["pfad"] = 'Arial_Normal';
  $Font[$i]["groesse"] = 64; //Für Integer/Double (Zahlen) brauchst du keine Anfürhungszeichen
}
```


----------



## Alice (17. Februar 2012)

Danke für deinen Beitrag. 

Das Problem ist wie ich dann später mit diesen Arrays weiter arbeiten kann. Mir gefallen die Mehrdimensionalen Arrays auch VIEL besser aber ich kann nun einmal nicht damit arbeiten. Also jetzt rein vom Wissen her. 

Hier der weitere Code wo ich die erstellten Arays vewende:

```
for($i=0; $i < strlen($var1); $i++) {
   $img1 = getimagesize("./images/sig/font/$Arial_Font[$i]/blue/$var1[$i].png");
}
```

Nehmen wir an ich würde ein Mehrdimensionalen Array erstellen. Wie müsste der Code dann hier aussehen?

Edit:

Arbeit dein Code ohne Pattern oder hast du das einfach ausgelassen?


```
$var1 = 'BMW50!0ps'; 
 
$pattern = '#(![A-Z0-9ÄÖÜ])|([A-Z0-9ÄÖÜ])|(@)#';  

if(preg_match_all($pattern, $var1, $matches) !== false)
{ 
   $Font = array();
   foreach($matches[0] as $i => $zeahler) 
   {  
      $Font[$i]["pfad"] = 'Arial_Normal';
      $Font[$i]["groesse"] = 64
   }
}
```


----------



## timestamp (17. Februar 2012)

Das habe ich aus Faulheitsgründen ausgelassen 

```
//Mehrdimensionales Beispiel
$MyArray2D = array();
$MyArray2D[0]["Name"] = "Hans";
$MyArray2D[0]["Alter"] = 34;
$MyArray2D[0]["Beruf"] = "Lehrer";

$MyArray2D[1]["Name"] = "Peter";
$MyArray2D[1]["Alter"] = 42;
$MyArray2D[1]["Beruf"] = "Maurer";

foreach( $MyArray2D as $MyArray1D ){
  echo 'Hallo ich bin '. $MyArray1D["Name"].', '.$MyArray1D["Alter"].' Jahre alt. Mein Beruf: '.$MyArray1D["Beruf"].'<br />';
}
//Oder:
$size = sizeof($MyArray2D);
for( $i = 0; $i < $size; $i++ ){
  echo 'Hallo ich bin '. $MyArray2D[$i]["Name"].', '.$MyArray2D[$i]["Alter"].' Jahre alt. Mein Beruf: '.$MyArray2D[$i]["Beruf"].'<br />';
}
```


----------



## Alice (17. Februar 2012)

timestamp hat gesagt.:


> ...



So ähnlich habe ich es eben mal selber ausprobiert und es geht auch!

Aber das wirft ein ganz neues Problem auf.


```
$var1 = 'BMW50!0ps'; 
 
$pattern = '#(![A-Z0-9ÄÖÜ])|([A-Z0-9ÄÖÜ])|(@)#'; 
  
if(preg_match_all($pattern, $var1, $matches) !== false) { 
    $count = count($matches[0]); 
    foreach($matches[0] as $i => $zeahler) { 
        if(!empty($matches[1][$i])) { 
            $Arial_Font[] = 'Arial_Normal'; 
            $groesse[] = '64'; 
        } 
        elseif(!empty($matches[2][$i])) { 
            $Arial_Font[] = 'Arial_Bold'; 
            $groesse[] = '32'; 
        } 
        elseif(!empty($matches[3][$i])) { 
            $Arial_Font[] = 'hier_pfad_für_@'; // @ matches
            $groesse[] = '64'; 
        }
        else 
        { 
            $Arial_Font[] = 'Arial_Bold'; 
            $groesse[] = '32'; 
        } 
    } 
} 
else 
{ 
    $Arial_Font[] = array(); 
} 
  
echo '<pre>'; 
print_r( $Arial_Font ); 
echo '<pre>';
```

Mit diesem Code konnte ich jedem Zeichen in der Variable einen eigenen Pfad zu weisen. Mit deinem Code von vorhin geht das zwar auch aber immer nur mit dem selben Pfad. Es findet keine Unterscheidung statt.


----------



## timestamp (17. Februar 2012)

Kann ich nicht ganz nachvollziehen...

```
$data = array();
if(preg_match_all($pattern, $var1, $matches) !== false) {  
    $count = count($matches[0]);  
    foreach($matches[0] as $i => $zeahler) {  
        if(!empty($matches[1][$i])) {  
            $data[$i]['Font'] = 'Arial_Normal';  
            $data[$i]['groesse'] = '64';  
        }  
        elseif(!empty($matches[2][$i])) {  
            $data[$i]['Font'] = 'Arial_Bold';  
            $data[$i]['groesse'] = '32';  
        }  
        elseif(!empty($matches[3][$i])) {  
            $data[$i]['Font'] = 'hier_pfad_für_@'; // @ matches 
           $data[$i]['groesse'] = '64';  
        } 
        else  
        {  
            $data[$i]['Font'] = 'Arial_Bold';  
           $data[$i]['groesse'] = '32';  
        }  
    }  
}  
   
echo '<pre>';  
var_dump($data);
echo '<pre>';
```


----------



## Alice (17. Februar 2012)

Danke! Ich probiere es sofort aus!


----------



## Alice (17. Februar 2012)

Wird das "$count" denn überhaupt benötigt?


----------



## timestamp (17. Februar 2012)

Guck mal ob du nach dem du $count initialisierst noch irgendwo darauf zugreifst. Wenn nicht, ist es unnötig.


----------



## Alice (17. Februar 2012)

Passt nicht 100% zum Thema aber ich möchte jetzt nicht noch ein neues starten.


```
$var1 = 'BMW500PS';
```

Ich suche eine Möglichkeit das vor jedem *Buchstaben* oder *Zahl* (sonst keine anderen Zeichen) ein Ausrufezeichen eingefügt wird.


```
echo $var1; // Ausgabe: !B!M!W!5!0!0!P!S
```

Kann mir da bitte noch jemand helfen?


----------



## Napofis (17. Februar 2012)

```
echo preg_replace('/([a-z0-9])/i', '!$1', 'BMW500PS');
//!B!M!W!5!0!0!P!S
```


----------



## Alice (21. März 2012)

Hallo Zusammen. 

Ich habe leider ein paar Probleme mit folgendem Code.


```
$var1 = '@@@ABCDEFG101234567A@B@C@1@2@3@@@!H!A!L!L!O@!0!0!7';


   $pattern = '#(![A-Z0-9ÄÖÜ])|([A-Z0-9ÄÖÜ])|(@)#';

   if(preg_match_all($pattern, $var1, $matches) !== false) 
   {
      foreach($matches[0] as $i => $zeahler) 
      {
         if(!empty($matches[1][$i])) 
         {
            $arial_font[$i] = 'small/'.$var1[$i].'.png';
         }
         elseif(!empty($matches[2][$i])) 
         {
            $arial_font[$i] = 'normal/'.$var1[$i].'.png';
         }
         elseif(!empty($matches[3][$i])) 
         {
            $arial_font[$i] = 'symbole/'.$var1[$i].'.png';
         }
            else
         {
            $arial_font[$i] = 'normal/'.$var1[$i].'.png';
         }
      }
   }

   echo '<pre>';
   print_r($arial_font);
   echo '</pre>';
```

Es wird folgendes ausgegeben:

```
Array
(
    [0] => symbole/@.png
    [1] => symbole/@.png
    [2] => symbole/@.png
    [3] => normal/A.png
    [4] => normal/B.png
    [5] => normal/C.png
    [6] => normal/D.png
    [7] => normal/E.png
    [8] => normal/F.png
    [9] => normal/G.png
    [10] => normal/1.png
    [11] => sonstiges/0.png
    [12] => normal/1.png
    [13] => normal/2.png
    [14] => normal/3.png
    [15] => normal/4.png
    [16] => normal/5.png
    [17] => normal/6.png
    [18] => normal/7.png
    [19] => normal/A.png
    [20] => symbole/@.png
    [21] => normal/B.png
    [22] => symbole/@.png
    [23] => normal/C.png
    [24] => symbole/@.png
    [25] => normal/1.png
    [26] => symbole/@.png
    [27] => normal/2.png
    [28] => symbole/@.png
    [29] => normal/3.png
    [30] => symbole/@.png
    [31] => symbole/@.png
    [32] => symbole/@.png
    [33] => small/!.png
    [34] => small/H.png
    [35] => small/!.png
    [36] => small/A.png
    [37] => small/!.png
    [38] => symbole/L.png
    [39] => small/!.png
    [40] => small/L.png
    [41] => small/!.png
    [42] => symbole/O.png
    [43] => normal/@.png
    [44] => normal/!.png
    [45] => normal/0.png
    [46] => sonstiges/!.png
    [47] => sonstiges/0.png
    [48] => sonstiges/!.png
)
```

1.) *Array Nr. 11* sollte nicht "sonstiges" sondern "normal" sein
2.) Ab *Array Nr. 44* "spinnt" das Array
3.) Ab *Array Nr. 33* werden Ausrufezeichen dazugezählt obwohl es nur ein "Unterscheidungszeichen" ist. Wobei ich GLAUBE weiss warum das so ist. -> [i]

Kann mir jemand helfen?

Ich möchte um Ressourcen zu sparen direkt ein "großes" Array für alles erstellen.


----------



## timestamp (21. März 2012)

Ersetze einmal $var[$i] durch $matches[0][$i].


----------



## Alice (21. März 2012)

Ich habe leider meinen Code falsch gepostet.


```
$var1 = '@@@ABCDEFG101234567A@B@C@1@2@3@@@!H!A!L!L!O@!0!0!7BL5000';


   $pattern = '#(![A-Z0-9ÄÖÜ])|([A-Z0-9ÄÖÜ])|(@)#';

   if(preg_match_all($pattern, $var1, $matches) !== false) 
   {
      foreach($matches[0] as $i => $zeahler) 
      {
         if(!empty($matches[1][$i])) 
         {
            $arial_font[$i] = 'Small/'.$matches[0][$i].'.png';
         }
         elseif(!empty($matches[2][$i])) 
         {
            $arial_font[$i] = 'Normal/'.$matches[0][$i].'.png';
         }
         elseif(!empty($matches[3][$i])) 
         {
            $arial_font[$i] = 'Symbole/'.$matches[0][$i].'.png';
         }
            else
         {
            $arial_font[$i] = 'Sonstiges/'.$matches[0][$i].'.png';
         }
      }
   }

   echo $var1;
   echo '<br />';
   echo '<pre>';
   print_r($arial_font);
   echo '</pre>';
```

Ausgabe:

```
Array
(
    [0] => Symbole/@.png
    [1] => Symbole/@.png
    [2] => Symbole/@.png
    [3] => Normal/A.png
    [4] => Normal/B.png
    [5] => Normal/C.png
    [6] => Normal/D.png
    [7] => Normal/E.png
    [8] => Normal/F.png
    [9] => Normal/G.png
    [10] => Normal/1.png
    [11] => Sonstiges/0.png
    [12] => Normal/1.png
    [13] => Normal/2.png
    [14] => Normal/3.png
    [15] => Normal/4.png
    [16] => Normal/5.png
    [17] => Normal/6.png
    [18] => Normal/7.png
    [19] => Normal/A.png
    [20] => Symbole/@.png
    [21] => Normal/B.png
    [22] => Symbole/@.png
    [23] => Normal/C.png
    [24] => Symbole/@.png
    [25] => Normal/1.png
    [26] => Symbole/@.png
    [27] => Normal/2.png
    [28] => Symbole/@.png
    [29] => Normal/3.png
    [30] => Symbole/@.png
    [31] => Symbole/@.png
    [32] => Symbole/@.png
    [33] => Small/!H.png
    [34] => Small/!A.png
    [35] => Small/!L.png
    [36] => Small/!L.png
    [37] => Small/!O.png
    [38] => Symbole/@.png
    [39] => Small/!0.png
    [40] => Small/!0.png
    [41] => Small/!7.png
    [42] => Normal/B.png
    [43] => Normal/L.png
    [44] => Normal/5.png
    [45] => Sonstiges/0.png
    [46] => Sonstiges/0.png
    [47] => Sonstiges/0.png
)
```

Warum wird die "0" immer als "Sonstiges" erkannt? Das Pattern ist doch richtig?

*Edit:*

So wie ich das verstehe müssten...

bei *$matches[1]* Buchstaben, Zahlen und Umlaute mit einem Ausrufezeichen davpr erkannt werden.

bei *$matches[2]* normale Buchstaben, Zahlen und Umlaute erkannt werden.

bei *$matches[3]* nur @-Zeichen erkannt werden

Sehe ich das falsch?


----------



## timestamp (21. März 2012)

So wie cih das sehe, solltest du mal folgendes in deine if() Bedingung hineinschreiben:


```
echo '<pre>';
var_dump($matches);
echo '</pre>';
```

Dann siehst du nämlich was überhaupt in deinem Array drinsteht.


----------



## Alice (21. März 2012)

So habe ich eben gemacht und die "0" wird auch an der richtigen Position (im richtigen Unter-Array) angezeigt.

Nur warum bekommt es dann den falschen Ordner zugewiesen?

*Edit:*

Ich habe mal zum testen die Variable "*$var*" geändert.


```
$var1 = '0123456789';
```

Es ist immer nur die Zahl "0" die nicht richtig zugeordnet wird.


----------



## timestamp (21. März 2012)

Ein Blick in die Funktionsreferenz offenbart dir die Ursache der Problems:
empty()


----------



## Alice (21. März 2012)

Das gibt es doch nicht.

Hast du eine Idee wie ich das lösen kann? Code so umprogrammieren das "empty" nicht benutzt wird?


----------



## timestamp (21. März 2012)

```
if( $foo == "" ) echo 'Foo ist ein leerer String';
if( strlen($foo) == 0 ) echo 'Foo ist ein leerer String';
```

Also wirklich... darauf hätte man doch kommen können.


----------



## Alice (21. März 2012)

timespamp, wieso reagierst du denn so "gereizt" auf meine Beiträge?

Ich würde ja gerne alles so gut verstehen wie du, aber ich verstehe halt nicht alles. Kannst du nicht bitte etwas Verständnis dafür aufbringen?

Ich versuche ja zu lernen und mir soviel wie möglich anzueignen aber ich habe eben meine Kapazitäten und irgendwie fehlt mir auch das gewissen Verständnis für komplexere PHP-Codes.

Berufsbedingt arbeite ich viel mit "SVERWEIS" und "Wenn-Dann-Sonst" Formeln in Microsoft Excel und trotz Jahrelanger Erfahrung mache ich immer noch Fehler.

Bitte akzeptiere mich als "PHP-****". 

Ich bin ja kein schlechter Typ nur weil ich vieles nicht verstehe.

Zum Thema:
Mir ist klar das die Zahl "0" das selbe ist wie "NULL" also praktisch LEER aber wie kann ich das Skript dazu überreden das die "0" in diesem Fall als Zahl betrachtet wird?


----------



## Parantatatam (22. März 2012)

```
# so ist es ...
if(!empty($var))
{
  # ...
}

# so sollte es sein ...
if($var !== '')
{
  # ...
}
```


----------



## Alice (22. März 2012)

einfach nur crack hat gesagt.:


> ```
> # so ist es ...
> if(!empty($var))
> {
> ...



Also "Variable ist nicht gleich leer".

Aber die IF-Abfrage ist aktuell nicht so wie bei "so ist es ...".


```
if(!empty($matches[1][$i])) 
   {
      $arial_font[$i] = 'Small/'.$matches[0][$i].'.png';
   }
```


```
if($var !== '') // Macht das Sinn? Drei IF-Abfragen mit der selben Bedingung?
   {
      $arial_font[$i] = 'Small/'.$matches[0][$i].'.png';
   }

// Vielleicht eher so?

   if($matches[1] !== '')
   {
      $arial_font[$i] = 'Small/'.$matches[0][$i].'.png';
   }
```


----------



## Parantatatam (22. März 2012)

Vielleicht ist es einfach schon sehr spät und du bist auch schon müde, ansonsten würde das hier einen Tiefpunkt in deinen Bemühungen um das Verständnis für PHP darstellen. Logischerweise müsse an die Stelle von meinem $var dein $matches[1][$i], $matches[2][$i] oder $matches[3][$i] hin, je nachdem, was bisher dort steht.


----------



## Alice (22. März 2012)

Ich war einfach nur schon zu Müde.   Ich arbeite ja auch 7 Tage die Woche.

Danke für eure Hilfe.

PS: Ich habe per Kontaktformular gebeten meinen Account hier im Forum zu löschen. Dieses Forum ist von der Hilfsbereitschaft der User wirklich sehr gut und ich habe mich eigentlich immer sehr wohl gefühlt hier.

Danke für Alles! Ihr habt mir sehr viel geholfen!


----------



## timestamp (22. März 2012)

bl5000 hat gesagt.:


> timespamp, wieso reagierst du denn so "gereizt" auf meine Beiträge?



Ich reagiere nicht gereizt. Ich bin allerdings der Meinung, dass Du es dir hier ein bisschen zu einfachst machst. Du beschäftigst dich schon seit Monaten mit PHP, was an sich sehr lobenswert ist, und doch seh ich keinen wirklichen Lernerfolg bei Dir - es kommen zu oft die grundlegendsten Fragen, was bei mir die Frage aufwirft, warum Du gleich mit größeren Projekten anfängst. Wir im Forum haben dir schon öfters empfohlen, jede Menge Grundlagen zu lernen, aber anscheinend - zumindest erscheint es mir so -  treffen wir da auf taube Ohren. 
Ich helfe wirklich gerne, selbstverständlich auch umsonst, aber ich hab hier langsam das Gefühl das
wir hier etwas ausgenutzt werden. Ich will Dir nicht zu nahe treten oder Dir etwas unterstellen,
ich sage nur wie ich das empfinde.

Gruß,

timestamp


----------



## Alice (22. März 2012)

Es ist aber nicht so! Das ist ja das traurige.

Ich gebe mir wirklich sehr viel Mühe.

Aber ich kann auch in die andere Richtung schauen und weiss was du meinst. Ich beschäftige mich in jeder freien Minuten mit PHP und meinem Projekt und warum sollte ich absichtlich etwas nicht lernen wenn es mir doch hilft?


----------

