2016-11-29 10 views
3

joomla CMSの制限により、(ケーキの)製品ページのフォームにフィールドを追加できる方法を考える必要がありました。警告なしでこの配列をループするにはどうすればいいですか?

私は以下を思いついた。

これは私の出発文字列です:

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

私が最初productpageの残りの部分から私のカスタムフィールドを分割する||に爆発します。その後、私は|を分解して、各カスタムフィールドを分離してから、その結果を*に展開して、フィールド名から選択オプションを分離します。すべてうまくいきますが、今では、:で爆発して、お互いの選択肢を分けていきたいと思います。

変数$linesには必要な情報が含まれています。私は、キー[1](オプション)とのデータのみを必要とするしかし

Array ([0] => 

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

) 

:配列はこのようになります。私が使用することはできません。

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

} 

それが与えるので:Warning: Invalid argument supplied for foreach() in ....

をデータが私のために使用可能であるように、私はオプションを分割することができますどのように?

私は次のことを試してみました:

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

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

しかし、その結果がこれです:彼らは一度だけ、文字列である一方

enter image description here

同じオプションは、複数回表示しました。

私の全体のコード:答えの追加情報については

<? 
 
// 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; 
 
?>

編集:

<?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

ここで問題を再現してくださいhttp://phpfiddle.org/ – Ionut

+0

@Ionut私はハードコードされた文字列を使用してスクリプト内でそれを使用していますが、スクリプトを実行すると、PHPコードはPHPのように表示されませんがインストールされています。また、どこに共有可能なリンクを得るか分かりません。 – twan

答えて

2

私はあなたがすべて異なる爆発し、区切り文字で自分が混乱してきていると思います必要とされる。オプション名を含む文字列ですname、およびオプション値の配列ですvalues

<?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); 

サンプルprint_r結果:

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 
       ) 

     ) 

) 
以下のスニペットは $options 2つのキーを持つ配列にすべてを分割します
+0

素晴らしいです、コードは今より多くのクリーナーです!しかし、どのように値が選択ボックスごとに1回だけ表示されることを確認することができますか?私は私の質問で使用するコードを追加しました。'$ test = ' '; '選択要素ごとに1つのオプションしか表示されません。そして、=記号の前にドットを追加すると、最初の選択ボックスには正しいオプションが表示されますが、2番目のオプションには最初と最後のオプションのすべてのオプションがあります。 – twan

+0

各オプションの 'values'配列をループする必要があります。したがって、ループ内にループが必要です。 – Andy

+0

私はそれをやっていますが、まだすべての新しいフィールドには、前のフィールドのすべての値があります。私は私の質問と同じコードを得ました(下の部分)。 – twan

関連する問題