2016-11-29 4 views
3

Aufgrund der Einschränkungen in den Joomla cms musste ich über eine Möglichkeit nachdenken, Felder zu einem Formular auf einer Produktseite (für Kuchen) hinzufügen zu können.Wie wiederhole ich dieses Array ohne Warnungen?

So kam ich auf Folgendes.

Das ist mein Start string:

|| 
Taart grootte*30cm:40cm:50cm 
|Kleur*rood:blauw:groen:wit 
|Optie 3*optie1:optie2:optie3 

ich explodiert zuerst auf || meine benutzerdefinierten Felder aus dem Rest der Produktseite zu spalten. Dann explodiere ich auf |, um jedes benutzerdefinierte hinzugefügte Feld zu trennen, dann explodiere ich dieses Ergebnis auf *, um die Auswahloptionen von den Feldnamen zu trennen. Alles funktioniert gut, aber jetzt möchte ich die Optionen voneinander trennen, indem Sie auf : explodieren. Die Variable $lines enthält die Informationen, die ich brauche. Das Array sieht wie folgt aus:

Array ([0] => 

Taart grootte [1] => 30cm:40cm:50cm 
) Array ([0] => Kleur [1] => rood:blauw:groen:wit 
) Array ([0] => Optie 3 [1] => optie1:optie2:optie3 

) 

Jedoch habe ich nur die Daten mit Schlüssel [1] (die Optionen) benötigen. Ich kann nicht verwenden:

foreach($lines[1] as $result){ 

} 

Denn es gibt: Warning: Invalid argument supplied for foreach() in ....

Wie kann ich teilen Sie die Optionen, so dass die Daten für mich nutzbar ist?

Ich habe versucht, die folgenden:

foreach($lines as $result){ 
    $resultaat = explode(':', $result); 
} 

foreach($resultaat as $final){ 
    $finalvar .= $final; 
} 
echo $finalvar; 

Aber das Ergebnis davon ist dieser:

enter image description here

Gleiche Optionen mehrfach angezeigt, während sie nur einmal in der Zeichenfolge sind.

Mein ganzer Code:

<? 
 
// Functie om alles te deleten tussen de aangegeven values (brackets in deze code) 
 
function delete_all_between($beginning, $end, $string) { 
 
$beginningPos = strpos($string, $beginning); 
 
$endPos = strpos($string, $end); 
 
if ($beginningPos === false || $endPos === false) { 
 
\t return $string; 
 
} 
 

 
$textToDelete = substr($string, $beginningPos, ($endPos + strlen($end)) - $beginningPos); 
 

 
return str_replace($textToDelete, '', $string); 
 
} 
 

 
// Explode the fulltext on || 
 
$explode = explode('||', $taartcr[0]['fulltext']); 
 
if(strpos($explode[1], '[') == false){ 
 
echo ''; 
 
echo $explode[0]; 
 
echo ''; 
 

 
// Explode fulltext after || on commas 
 
$explode2 = explode('|', $explode[1]); 
 

 
$lijst .= '<div class="form-group">'; 
 

 
foreach($explode2 as $list){ 
 

 
\t $lines = explode('*', $list); 
 

 
    
 

 
    foreach($lines as $result){ 
 
\t $resultaat = explode(':', $result); 
 
    } 
 

 
    foreach($resultaat as $final){ 
 
\t $finalvar .= $final; 
 
    } 
 

 
    echo $finalvar; 
 

 

 

 
    // echo $finalvar; 
 

 

 
    // echo '<pre>'; 
 
\t // // print_r($resultaat); 
 
    // echo $resultaat; 
 
\t // echo '</pre>'; 
 

 

 

 
\t if($list[0] != ''){ 
 
\t \t $lijst .= ' 
 
\t <i class="fa fa-birthday-cake cbx-contact-icon"></i> 
 
\t <select required="" placeholder="'.strip_tags($lines[0]).'" id="cbxname" class="form-control cbxname cbx-form-control" name="cbxname"> 
 
\t <option value="" disabled selected>'.strip_tags($lines[0]).'</option> 
 
\t '.$resultaat.' 
 
\t </select> 
 
\t \t '; 
 
\t } 
 
} 
 
$lijst .= '</div>'; 
 
}else{ 
 
$string = $explode[1]; 
 
$nobrackets = delete_all_between('[', ']', $string); 
 

 
echo '<div class="col-md-6 wow fadeInUp" data-wow-duration="2s">'.strip_tags($explode[0]).'</div>'; 
 
echo '<div class="col-md-6 wow fadeInUp" data-wow-duration="2s">'.strip_tags($nobrackets).'</div>'; 
 
} 
 
echo $lijst; 
 
?>

Bearbeiten für zusätzliche Informationen über Antwort:

<?php 
$lines = explode('||', $taartcr[0]['fulltext']); 
$lines = end($lines); 
$lines = explode('|', $lines); 

$options = []; 

foreach ($lines as $line) { 
    $result = explode('*', $line); 

    $name = trim($result[0]); 
    $values = $result[1]; 

    $options[] = [ 
     'name' => $name, 
     'values' => array_map('trim', explode(':', $values)), 
    ]; 
} 

foreach($options as $field){ 
$options1 = $field['values']; 
foreach($options1 as $option){ 
    $test .= '<option>'.$option.'</option>'; 
} 

$fields .= ' 
<div class="form-group"> 
    <i class="fa fa-birthday-cake cbx-contact-icon"></i><select required="" placeholder="'.$field['name'].'" id="cbxname" class="form-control cbxname cbx-form-control" name="cbxname"> 
     <option value="" disabled selected>'.$field['name'].'</option> 
     '.$test.' 
    </select> 
    <label for="cbxname" class="error valid" id="cbxname-error"></label> 
</div>'; 

} 
echo $fields; 
?> 
+0

Bitte replizieren Sie Ihr Problem hier http://phpfiddle.org/ – Ionut

+0

@Ionut Ich versuche, indem Sie nur eine fest codierte Zeichenfolge verwenden und das in meinem Skript, aber wenn ich das Skript ausführen, sehe ich nur den PHP-Code echoed wie kein PHP ist installiert. Haben Sie auch keine Ahnung, wo Sie einen teilbaren Link bekommen können. – twan

Antwort

2

Ich denke, Sie bekommen, sich verwirrt mit all den verschiedenen explodiert und Begrenzer das sind erforderlich. Das Snippet unten wird alles in einen $options Array mit zwei Schlüsseln aufgeteilt: name, die einen String ist die Option Namen enthält, und values, die eine Reihe von Optionswerten ist:

<?php 

$str = "|| 
    Taart grootte*30cm:40cm:50cm 
    |Kleur*rood:blauw:groen:wit 
    |Optie 3*optie1:optie2:optie3"; 

$lines = explode('||', $str); 
$lines = end($lines); 
$lines = explode('|', $lines); 

$options = []; 

foreach ($lines as $line) { 
    $result = explode('*', $line); 

    $name = trim($result[0]); 
    $values = $result[1]; 

    $options[] = [ 
     'name' => $name, 
     'values' => array_map('trim', explode(':', $values)), 
    ]; 
} 

print_r($options); 

Probe print_r Ergebnis:

Array 
(
    [0] => Array 
     (
      [name] => Taart grootte 
      [values] => Array 
       (
        [0] => 30cm 
        [1] => 40cm 
        [2] => 50cm 
       ) 

     ) 

    [1] => Array 
     (
      [name] => Kleur 
      [values] => Array 
       (
        [0] => rood 
        [1] => blauw 
        [2] => groen 
        [3] => wit 
       ) 

     ) 

    [2] => Array 
     (
      [name] => Optie 3 
      [values] => Array 
       (
        [0] => optie1 
        [1] => optie2 
        [2] => optie3 
       ) 

     ) 

) 
+0

Super, der Code ist jetzt viel sauberer! Aber wie kann ich sicherstellen, dass die Werte nur einmal pro Selectbox angezeigt werden? Ich habe den Code hinzugefügt, den ich in meiner Frage verwende.Wenn ich '$ test = ' '; 'Es wird nur eine Option für jedes select-Element angezeigt. Und wenn ich einen Punkt vor dem Zeichen = hinzufüge, hat das erste Auswahlfeld die richtigen Optionen, aber das zweite hat alle Optionen der ersten und seiner eigenen Optionen, dies wird für jedes folgende Auswahlelement fortgesetzt. – twan

+0

Sie müssen das Array 'values' jeder Option durchlaufen. Sie brauchen also eine Schleife innerhalb einer Schleife. – Andy

+0

Ich mache das, aber jedes neue Feld hat alle Werte der vorherigen Felder. Ich habe genau den gleichen Code wie in meiner Frage (der untere Teil). – twan