2012-04-19 54 views
3

我有一个创建章节和创建数组的子章节的动态表单: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" 
         } 
     } 

我对数组很弱。我读过几篇关于多维数组和排序的文章,但没有碰到任何运气,或者看到任何类似于我的例子来理解我需要如何调整它。

我想为每个:

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

该表单可以动态创建数百个深度,而且我只能打印整个数组或每个$ key的所有$值。我没有任何成功通过各种阵列匹配。

我希望你跟着。如果您有任何建议,我会非常感激。

回答

2

假设在$_POST各元件具有相同的长度他人,可以使用count()来获得元件中的一个(例如textfield)的长度,并做了for循环。

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

在模板中:

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

@MaxSpencer,我其实是在编辑小号的东西imilar。我认为改变阵列最初的构建方式是最有意义的。 – clexmond 2012-04-19 16:07:28

1

你可以只使用一个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!

0

这是你需要的东西:

<?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 
} 
?> 
+0

假设它们长度相同,或者您将收到未定义的通知。 – MetalFrog 2012-04-19 16:23:08

0

如果你确实想要做的模板语义原因的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 } ?>