【问题标题】:How get values from the multidimensional array in PHP?如何从 PHP 中的多维数组中获取值?
【发布时间】:2015-03-18 02:45:13
【问题描述】:

我有一个如下所示的数组。我想获取 startTime 和 endTime 的值。 startTime 和 endTime 的值应该出现在下拉列表中。表示第一个数组块的 startTime 和 endTime 的值应该出现在选择框的一个选项中,第二个数组块应该出现在第二个选项中。我有大约 100 多个数组块。

Array
(
    [upcoming] => Array
        (
            [webinars] => Array
                (
                    [0] => Array
                        (
                            [times] => Array
                                (
                                    [0] => Array
                                        (
                                            [startTime] => 2015-03-23T11:00:00Z
                                            [endTime] => 2015-03-23T12:00:00Z
                                        )

                                )
                        )

                    [1] => Array
                        (
                            [times] => Array
                                (
                                    [0] => Array
                                        (
                                            [startTime] => 2015-03-26T11:00:00Z
                                            [endTime] => 2015-03-26T12:00:00Z
                                        )

                                )

                        )
)

            [status] => 1
        )

)

所以为了从数组中获取值,我编写了这样的代码

foreach($webinars as $key=>$val) {
    foreach($val as $test) {
      foreach($test as $ksh) {
        foreach($ksh['times'] as $k=>$v) {
          echo $v['startTime'];
          echo $v['endTime'];
        }
      }
    }
  }

但我不认为使用 4 foreach 获取 startTime 和 endTime 是一种更聪明的方法。我想知道有没有更聪明的方法来获取这些值?任何帮助和建议都将是非常可观的。谢谢

【问题讨论】:

  • times 数组是否总是只包含一个数组元素,还是可以更多? upcoming 键也一样,在那个级别上也可以有不同的键吗?
  • @CBroe 是的,时间和即将到来的将始终只有一个数组元素。
  • 那么您不需要遍历这些级别,而是可以直接通过它们的键访问元素。
  • @CBore 你能分享一些代码吗?
  • 你的php版本是多少?

标签: php arrays multidimensional-array foreach


【解决方案1】:

时间和即将到来的将始终只有一个数组元素

那么实际的webinars 级别是唯一可以有多个条目的东西,所以很简单,比如

foreach($webinars['upcoming']['webinars'] as $webinar) {
  echo $webinar['times'][0]['startTime'] . ' - ' . $webinar['times'][0]['endTime'] . "<br>\n";
}

应该……(假设保存整个数组的变量名为$webinars。)

【讨论】:

    【解决方案2】:

    我不知道这是否有助于或解决您的问题,但也许您可以了解如何以不同的方式解决您想要的问题:

    <?php
        $arr = array
        (
         'upcoming' => array
         (
          'webinars' => array
          (
           0 => array
           (
            'times' => array
            (
             0 => array
             (
              'startTime' => '2015-03-23T11:00:00Z',
              'endTime' => '2015-03-23T12:00:00Z'
              )
    
             )
            ),
    
           1 => array
           (
            'times' => array
            (
             0 => array
             (
              'startTime' => '2015-03-26T11:00:00Z',
              'endTime' => '2015-03-26T12:00:00Z'
              )
    
             )
    
            ),
           ),
    
          'status' => 1
          )
    
         );
        echo "<pre>";
        var_dump($arr);
        echo "</pre>";
    
    
        function searchByKey(array $array, $search,&$result) {
            foreach (new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as $key => $value) {
                if ($search === $key)
                    $result[] = $value;
            }
            return false;
        }
    
        $startTimeArray = array();
    
        searchByKey($arr, 'startTime', $startTimeArray);
    
        var_dump($startTimeArray);
    
        $endTimeArray = array();
    
        searchByKey($arr, 'endTime', $endTimeArray);
    
        var_dump($endTimeArray);
    
    
    
    ?>
    

    【讨论】:

      【解决方案3】:

      试试这个,这可能对你有帮助:

      <?php
      
          $array['upcoming']['webinars']=array(
                  0 => array(
                          'times' => array(
                                      0 => array(
                                              'startTime' => '2015-03-23T11:00:00Z',
                                              'endTime' => '2015-03-23T12:00:00Z',
                                          )
                              )
      
                      ),
                  1 => array(
                          'times' => array(
                                      0 => array(
                                              'startTime' => '2015-03-26T11:00:00Z',
                                              'endTime' => '2015-03-26T12:00:00Z',
                                          )
                              )
      
                      ),
              );
      
      
          ?>
      
          <select name="time_select">
          <option value = ''> Select Time </option>
          <?php
      
              $webinars = $array['upcoming']['webinars'];
              foreach($webinars as $key => $val) {
                  foreach($val['times'] as $time) {
                      echo '<option value="any_value">'.$time['startTime'].'-----'.$time['endTime'].'</option>';    
                  }
            }
          ?>
          </select>
      

      【讨论】:

        【解决方案4】:

        您只需要 array_map(),更多信息请参阅:

        http://php.net/manual/en/function.array-map.php

        试试这个:

        $array = array ( 'upcoming' => array ( 'webinars' => array ( 0 => array ( 'times' => array ( 0 => array ( 'startTime' => '2015-03-23T11:00:00Z', 'endTime' => '2015-03-23T12:00:00Z', ), ), ), 1 => array ( 'times' => array ( 0 => array ( 'startTime' => '2015-03-26T11:00:00Z', 'endTime' => '2015-03-26T12:00:00Z', ), ), ), ), 'status' => '1', ), );
        
        $start = array_map(function($n) {return $n['times'][0]['startTime'];}, $array['upcoming']['webinars']);
        
        print_r($start);
        echo "<br>";
        /*
        Array
        (
            [0] => 2015-03-23T11:00:00Z
            [1] => 2015-03-26T11:00:00Z
        )
        */
        
        echo implode("<br>", $start);
        
        /*
        2015-03-23T11:00:00Z
        2015-03-26T11:00:00Z
        */
        
        $end = array_map(function($n) {return $n['times'][0]['endTime'];}, $array['upcoming']['webinars']);
        
        echo "<br>";
        print_r($end);    
        echo "<br>";
        /*
        Array
        (
            [0] => 2015-03-23T12:00:00Z
            [1] => 2015-03-26T12:00:00Z
        )
        */
        
        echo implode("<br>", $end);
        /*
        2015-03-23T12:00:00Z
        2015-03-26T12:00:00Z
        */ 
        

        【讨论】:

        • @NewUser 你有预付款吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多