PHP: foreach в многомерных массивах

У меня есть динамическая форма для создания глав и суб-глав, которые создают массив:

var_dump ($ _ POST);

array{["textfield"] => array { [0] => "title one" [1] => "title two" [2] => "title three" [4] => "title four" } ["textarea"] => array { [0] => "title text" [1] => "title summary" [2] => "title description" [4] => "title details" } ["hidden"] => array { [0] => "1" [1] => "2" [2] => "3" [4] => "1" } } 

Я очень слаб с массивами. Я прочитал несколько статей по многомерным массивам и сортировке, но havent повезло или видел примеры, достаточно похожие на мои, чтобы понять, как мне нужно это корректировать.

Я хотел бы для каждого:

 <div class="row<? echo $hidden ?>"> <h2><? echo $textfield ?></h2> <h3><? echo $textarea ?></h3> </div> 

который соответствует ключу 0 (или соответствующему номеру ключа) и значению через несколько массивов. Похожий на:

 <div class="row<? echo $_POST['hidden'][0] ?>"> <h2><? echo $_POST['textfield'][0] ?></h2> <h3><? echo $_POST['textarea'][0] ?></h3> </div> <div class="row<? echo $_POST['hidden'][1] ?>"> <h2><? echo $_POST['textfield'][1] ?></h2> <h3><? echo $_POST['textarea'][1] ?></h3> </div> <div class="row<? echo $_POST['hidden'][2] ?>"> <h2><? echo $_POST['textfield'][2] ?></h2> <h3><? echo $_POST['textarea'][2] ?></h3> </div> <div class="row<? echo $_POST['hidden'][3] ?>"> <h2><? echo $_POST['textfield'][3] ?></h2> <h3><? echo $_POST['textarea'][3] ?></h3> </div> 

Эта форма может динамически создаваться сотнями глубин, и мне удалось распечатать весь массив или все значения $ для каждого ключа $. У меня не было успеха, сопоставляя различные массивы.

Надеюсь, вы последуете. Если у вас есть предложения, я буду очень благодарен.

В шаблоне:

 <? for ($i = 0; $i < count($_POST['textfield']); $i++): ?> <div class="row<? echo $_POST['hidden'][$i] ?>"> <h2><? echo $_POST['textfield'][$i] ?></h2> <h3><? echo $_POST['textarea'][$i] ?></h3> </div> <? endfor; ?> 

Хотя это будет работать отлично (при условии, что каждый из вложенных массивов имеет одинаковую длину), я думаю, что более подходящим способом построения массива будет что-то вроде:

 array{ [0] => array{ ["hidden"] => "1" ["textarea"] => "title text" ["textfield"] => "title one" } [1] => array{ ["hidden"] => "2" ["textarea"] => "title summary" ["textfield"] => "title two" } } 

Затем ваша петля выглядит так:

 <? foreach ($array as $chapter): ?> <div class="row<? echo $chapter['hidden'] ?>"> <h2><? echo $chapter['textfield'] ?></h2> <h3><? echo $chapter['textarea'] ?></h3> </div> <? endforeach; ?> 

Предполагая, что каждый элемент в $_POST имеет ту же длину, что и другие, вы можете использовать count() чтобы получить длину одного из элементов (например, textfield ) и сделать цикл for .

 $length = count($_POST['textfield']); for ($i = 0; $i < $length; $i++) { echo $_POST['textfield'][$i]; } 

Вместо этого вы можете использовать цикл for здесь, если знаете ключи массива:

 for($i=0;$i<count($array);$i++){ printf('<div class="row%s"><h2>%s</h2><h3>%s</h3></div>%s',$_POST['hidden'][$i],$_POST['textfield'][$i],$_POST['textarea'][$i],PHP_EOL); } 

Simples!

Это то, что тебе надо :

  <?php // $x = %your_array foreach ($x['hidden'] as $k => $v) { ?> <div class="row<? echo $x['hidden'][$k] ?>"> <h2><? echo $x['textfield'][$k]; ?></h2> <h3><? echo $x['textarea'][$k]; ?></h3> </div> <?php } ?> 

Если вы хотите сделать foreach в шаблоне по семантическим причинам, вы могли бы сделать некоторую дополнительную работу заранее, чтобы поменять размеры массива следующим образом:

 $rows = array(); for ($i = 0; $i < count($_POST['textfield']); $i++) { $rows[i]['title'] = $_POST['textfield'][$i]; $rows[i]['text'] = $_POST['textarea'][$i]; $rows[i]['hidden'] = $_POST['hidden'][$i]; } 

Затем вы можете сделать foreach в своем шаблоне так:

 <?php foreach ($rows as $row) { ?> <div class="row<? echo $row['hidden'] ?>"> <h2><? echo $row['title'] ?></h2> <h3><? echo $row['text'] ?></h3> </div> <?php } ?>