【问题标题】:How can I make this multidimensional array and these foreach loops work together?如何使这个多维数组和这些 foreach 循环一起工作?
【发布时间】:2009-05-11 18:17:09
【问题描述】:
// a beautiful multidimensional array

public $form = array (
        array(
            'field' => 'email',
            array(
                'params' => 
                array(
                    'rule' => 'email',
                    'on' => 'create',
                    'required' => true,
                    ),
                ),
            array(
                'params' =>
                array(
                    'rule' => 'email',
                    'on' => 'update',
                    'required' => false,
                    )
                )
            )
        );

// beautiful foreach loops

public function validate($form) {
    foreach ($form as $valueA) {
        $field = $valueA['field'];

        foreach ($valueA as $valueB) {
            $params = $valueB['params'];

            foreach ($valueB as $valueC) {
                $rule = $valueC['on'];
                $on = $valueC['on'];
                $required = $valueC['required'];

                $this->isValid($field, $rule, $on, $required);
            }
        }
    }
}

// they do not work together!!!

【问题讨论】:

  • 为什么一切都如此“美丽”?
  • 我正在尝试编写可维护的代码。
  • 这似乎可以进一步简化,我不喜欢你如何将“参数”包装在一个数组中
  • 仍在尝试 public function validate($form) { for ($a = 0; $a isValid($field, $rule, $on, $required); } } } }

标签: php foreach multidimensional-array


【解决方案1】:

在我看来,您将在第二个循环中产生错误:

foreach ($ValueA as $ValueB) {

这将在循环中包含field,并且在尝试将其作为数组访问时会遇到问题。

另外,我认为您的第三个循环是:

foreach ($params as $ValueC) {

否则会遇到和中间循环一样的问题。

我认为,如果您打算继续将其用作数组而不是像其他人建议的那样将其重构为类,您应该对其进行重构,以便命名数据都处于同一级别。请注意,这降低了数组(一点)和循环(很多)的复杂性。

public $form = array (
    array(
        'field' => 'email',
        'params' => array(
            array(
                'rule' => 'email',
                'on' => 'create',
                'required' => true,
            ),
            array(
                'rule' => 'email',
                'on' => 'update',
                'required' => false,
            )
        )
    )
);

public function validate($form) {
    foreach ($form as $field_params) {
        $field = $field_params['field'];

        foreach ($field_params['params'] as $param) {
            $this->isValid($field, $param['rule'], $param['on'], $param['required']);
        }
    }
}

【讨论】:

    【解决方案2】:

    此页面有一些使用 for 循环访问多维数组元素的示例:http://www.webcheatsheet.com/PHP/multidimensional_arrays.php

    【讨论】:

    • 三维数组缺少foreach循环:-(
    • 好吧,你可以有一些变量来计算在数组中输入的行数,并执行 for 循环直到该点。我不是 PHP 专家,但我认为您应该能够做类似的事情。
    【解决方案3】:

    尽管这些数组很“漂亮”,但在我看来,这确实像是一个类会更擅长的东西,而且处理起来会容易得多。

    【讨论】:

      【解决方案4】:

      那个多维数组在我看来并不漂亮。它看起来像一团糟。这似乎更合乎逻辑:

      public $form = array (
                  'field' => 'email',
                  'params' => 
                    array(
                      array(
                          'rule' => 'email',
                          'on' => 'create',
                          'required' => true,
                          ),
                      array(
                          'rule' => 'email',
                          'on' => 'update',
                          'required' => false,
                          )
                      )
              );
      

      【讨论】:

      • 这是因为会有多个'field's和'param's,所以它们必须在单独的数组中。
      【解决方案5】:

      尝试以var_dump() 为例,在您的情况下调试$valueX 是什么。

      可能是foreach($array as $key => $value) 是你在找什么

      【讨论】:

        猜你喜欢
        • 2012-04-26
        • 1970-01-01
        • 2016-12-20
        • 1970-01-01
        • 2017-06-07
        • 2011-08-30
        • 2015-06-02
        • 2015-05-14
        • 2017-01-27
        相关资源
        最近更新 更多