【问题标题】:PHP: foreach in multidimensional arraysPHP:多维数组中的 foreach
【发布时间】:2012-05-01 04:44:15
【问题描述】:

我有一个动态表单,用于创建创建数组的章节和子章节:

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 的所有 $values。我没有通过各种数组成功匹配。

我希望你能跟随。如果您有任何建议,我将不胜感激。

【问题讨论】:

    标签: php arrays loops multidimensional-array


    【解决方案1】:

    在模板中:

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

    【讨论】:

    • @MaxSpencer,我实际上是在编辑类似的东西。我认为改变最初构建数组的方式是最有意义的。
    【解决方案2】:

    假设$_POST 中的每个元素与其他元素的长度相同,您可以使用count() 获取其中一个元素的长度(例如textfield)并执行for 循环。

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

    【讨论】:

      【解决方案3】:

      如果您知道数组键,则可以在此处使用 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);
      }
      

      简单!

      【讨论】:

        【解决方案4】:

        这是你需要的吗:

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

        【讨论】:

        • 假设它们的长度相同,否则您将收到未定义的通知。
        【解决方案5】:

        如果您出于语义原因确实想在模板中执行 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 } ?>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-10-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-13
          • 2018-03-01
          • 1970-01-01
          • 2011-09-18
          相关资源
          最近更新 更多