如何在没有警告的情况下循环此数组

时间:2016-11-29 13:38:11

标签: php arrays loops

由于joomla cms的限制,我不得不考虑一种方法,可以在产品页面上为表单添加字段(用于蛋糕)。

所以我想出了以下内容。

这是我的起始字符串:

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

我首先在||上展开,以便从产品页面的其余部分拆分自定义字段。然后我在|上展开以分隔每个自定义添加的字段,然后我在*上展开该结果以从字段名称中分离选择选项。一切运作良好,但现在我想通过在:上爆炸来分离彼此的选项。

变量$lines包含我需要的信息。该数组如下所示:

Array ( [0] =>

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

)

但是我只需要键[1](选项)的数据。我无法使用:

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) {
	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){

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

  

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

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

  echo $finalvar;



  // echo $finalvar;


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



	if($list[0] != ''){
		$lijst .= '
	<i class="fa fa-birthday-cake cbx-contact-icon"></i>
	<select required="" placeholder="'.strip_tags($lines[0]).'" id="cbxname" class="form-control cbxname cbx-form-control" name="cbxname">
	  <option value="" disabled selected>'.strip_tags($lines[0]).'</option>
	  '.$resultaat.'
	</select>
		';
	}
}
$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;
?>
&#13;
&#13;
&#13;

编辑以获取有关答案的其他信息:

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

1 个答案:

答案 0 :(得分:2)

我认为你对所有不同的爆炸和分隔符感到困惑。下面的代码段会将所有内容拆分为$options数组,其中包含两个键: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
                )

        )

)