【问题标题】:PHP foreach loop adding extra loop and how to return new array from withinPHP foreach 循环添加额外循环以及如何从内部返回新数组
【发布时间】:2015-02-15 03:35:24
【问题描述】:

我有一个多维 php 数组,用于存储我的商店的营业时间和关闭时间。该数组包含有关商店的其他数据,但是在此特定函数中,我试图创建一个新数组,其中仅将日期作为索引值,将营业时间和营业时间作为数组。像下面这样

$hours = array(
    'mon' => array('11:00-23:00'), 
    'tue' => array('11:00-23:00'),
    'wed' => array('11:00-22:30'),
    'thu' => array('11:00-02:30'),
    'fri' => array('11:00-02:30'),
    'sat' => array('11:00-02:30'),
    'sun' => '', 
);

我当前的带有 for 循环的 foreach 遍历我现有的数组,并为每天的打开和关闭时间返回一个变量。但是,出于调试目的,我在底部只包含了一个简单的打印。每次 foreach 返回正确的 day: open to close 但是它总是返回一个额外的 :to ,就好像它正在做一个额外的循环一样。我已经转储了原始数组,并且每次它返回一个以 (7) 作为计数的数组。其次,从这个 foreach for 循环中返回类似上述数组的最有效方法是什么。

foreach ($this -> entries as $entry) {
    for ($i = 0; $i < count($entry); $i++) {
        $day = $entry[$i]['day_open']['value'];
        $open = $entry[$i]['open_hour']['value'];
        $close = $entry[$i]['close_hour']['value'];
        print $day . " : " . $open . " to " . $close . "<br>";
    }
}

这是 $this -> 条目的 var_dump

array(3) { ["entries"]=> array(7) { 
    [0]=> array(11) { ["id"]=> string(1) "1" ["created"]=> int(1418692508) ["updated"]=> bool(false) ["created_by"]=> string(1) "1" ["ordering_count"]=> string(1) "1" ["close_hour"]=> array(3) { ["key"]=> string(4) "10pm" ["val"]=> string(8) "10:00 PM" ["value"]=> string(8) "10:00 PM" } ["open_hour"]=> array(3) { ["key"]=> string(3) "2pm" ["val"]=> string(8) "02:00 PM" ["value"]=> string(8) "02:00 PM" } ["day_open"]=> array(3) { ["key"]=> string(3) "Sun" ["val"]=> string(3) "Sun" ["value"]=> string(3) "Sun" } ["last"]=> string(1) "0" ["odd_even"]=> string(3) "odd" ["count"]=> int(1) } 
    [1]=> array(11) { ["id"]=> string(1) "2" ["created"]=> int(1418692519) ["updated"]=> int(1418698391) ["created_by"]=> string(1) "1" ["ordering_count"]=> string(1) "2" ["close_hour"]=> array(3) { ["key"]=> string(4) "10pm" ["val"]=> string(8) "10:00 PM" ["value"]=> string(8) "10:00 PM" } ["open_hour"]=> array(3) { ["key"]=> string(3) "2pm" ["val"]=> string(8) "02:00 PM" ["value"]=> string(8) "02:00 PM" } ["day_open"]=> array(3) { ["key"]=> string(3) "Mon" ["val"]=> string(3) "Mon" ["value"]=> string(3) "Mon" } ["last"]=> string(1) "0" ["odd_even"]=> string(4) "even" ["count"]=> int(2) } 
    [2]=> array(11) { ["id"]=> string(1) "3" ["created"]=> int(1418692525) ["updated"]=> bool(false) ["created_by"]=> string(1) "1" ["ordering_count"]=> string(1) "3" ["close_hour"]=> array(3) { ["key"]=> string(4) "10pm" ["val"]=> string(8) "10:00 PM" ["value"]=> string(8) "10:00 PM" } ["open_hour"]=> array(3) { ["key"]=> string(3) "2pm" ["val"]=> string(8) "02:00 PM" ["value"]=> string(8) "02:00 PM" } ["day_open"]=> array(3) { ["key"]=> string(3) "Tue" ["val"]=> string(3) "Tue" ["value"]=> string(3) "Tue" } ["last"]=> string(1) "0" ["odd_even"]=> string(3) "odd" ["count"]=> int(3) } 
    [3]=> array(11) { ["id"]=> string(1) "4" ["created"]=> int(1418692529) ["updated"]=> bool(false) ["created_by"]=> string(1) "1" ["ordering_count"]=> string(1) "4" ["close_hour"]=> array(3) { ["key"]=> string(4) "10pm" ["val"]=> string(8) "10:00 PM" ["value"]=> string(8) "10:00 PM" } ["open_hour"]=> array(3) { ["key"]=> string(3) "2pm" ["val"]=> string(8) "02:00 PM" ["value"]=> string(8) "02:00 PM" } ["day_open"]=> array(3) { ["key"]=> string(3) "Wed" ["val"]=> string(3) "Wed" ["value"]=> string(3) "Wed" } ["last"]=> string(1) "0" ["odd_even"]=> string(4) "even" ["count"]=> int(4) } 
    [4]=> array(11) { ["id"]=> string(1) "5" ["created"]=> int(1418692536) ["updated"]=> bool(false) ["created_by"]=> string(1) "1" ["ordering_count"]=> string(1) "5" ["close_hour"]=> array(3) { ["key"]=> string(4) "10pm" ["val"]=> string(8) "10:00 PM" ["value"]=> string(8) "10:00 PM" } ["open_hour"]=> array(3) { ["key"]=> string(3) "2pm" ["val"]=> string(8) "02:00 PM" ["value"]=> string(8) "02:00 PM" } ["day_open"]=> array(3) { ["key"]=> string(3) "Thu" ["val"]=> string(3) "Thu" ["value"]=> string(3) "Thu" } ["last"]=> string(1) "0" ["odd_even"]=> string(3) "odd" ["count"]=> int(5) } 
    [5]=> array(11) { ["id"]=> string(1) "6" ["created"]=> int(1418692549) ["updated"]=> int(1418698491) ["created_by"]=> string(1) "1" ["ordering_count"]=> string(1) "6" ["close_hour"]=> array(3) { ["key"]=> string(4) "12am" ["val"]=> string(8) "12:00 AM" ["value"]=> string(8) "12:00 AM" } ["open_hour"]=> array(3) { ["key"]=> string(3) "2pm" ["val"]=> string(8) "02:00 PM" ["value"]=> string(8) "02:00 PM" } ["day_open"]=> array(3) { ["key"]=> string(3) "Fri" ["val"]=> string(3) "Fri" ["value"]=> string(3) "Fri" } ["last"]=> string(1) "0" ["odd_even"]=> string(4) "even" ["count"]=> int(6) } 
    [6]=> array(11) { ["id"]=> string(1) "7" ["created"]=> int(1418692559) ["updated"]=> int(1418698459) ["created_by"]=> string(1) "1" ["ordering_count"]=> string(1) "7" ["close_hour"]=> array(3) { ["key"]=> string(4) "12am" ["val"]=> string(8) "12:00 AM" ["value"]=> string(8) "12:00 AM" } ["open_hour"]=> array(3) { ["key"]=> string(3) "2pm" ["val"]=> string(8) "02:00 PM" ["value"]=> string(8) "02:00 PM" } ["day_open"]=> array(3) { ["key"]=> string(3) "Sat" ["val"]=> string(3) "Sat" ["value"]=> string(3) "Sat" } ["last"]=> string(1) "1" ["odd_even"]=> string(3) "odd" ["count"]=> int(7) } 
    } 
    ["pagination"]=> NULL ["total"]=> int(7) 
}

在 print_r 中

Array ( [entries] => Array (
[0] => Array ( [id] => 1 [created] => 1418692508 [updated] => [created_by] => 1 [ordering_count] => 1 [close_hour] => Array ( [key] => 10pm [val] => 10:00 PM [value] => 10:00 PM ) [open_hour] => Array ( [key] => 2pm [val] => 02:00 PM [value] => 02:00 PM ) [day_open] => Array ( [key] => Sun [val] => Sun [value] => Sun ) [last] => 0 [odd_even] => odd [count] => 1 ) 
[1] => Array ( [id] => 2 [created] => 1418692519 [updated] => 1418698391 [created_by] => 1 [ordering_count] => 2 [close_hour] => Array ( [key] => 10pm [val] => 10:00 PM [value] => 10:00 PM ) [open_hour] => Array ( [key] => 2pm [val] => 02:00 PM [value] => 02:00 PM ) [day_open] => Array ( [key] => Mon [val] => Mon [value] => Mon ) [last] => 0 [odd_even] => even [count] => 2 ) 
[2] => Array ( [id] => 3 [created] => 1418692525 [updated] => [created_by] => 1 [ordering_count] => 3 [close_hour] => Array ( [key] => 10pm [val] => 10:00 PM [value] => 10:00 PM ) [open_hour] => Array ( [key] => 2pm [val] => 02:00 PM [value] => 02:00 PM ) [day_open] => Array ( [key] => Tue [val] => Tue [value] => Tue ) [last] => 0 [odd_even] => odd [count] => 3 ) 
[3] => Array ( [id] => 4 [created] => 1418692529 [updated] => [created_by] => 1 [ordering_count] => 4 [close_hour] => Array ( [key] => 10pm [val] => 10:00 PM [value] => 10:00 PM ) [open_hour] => Array ( [key] => 2pm [val] => 02:00 PM [value] => 02:00 PM ) [day_open] => Array ( [key] => Wed [val] => Wed [value] => Wed ) [last] => 0 [odd_even] => even [count] => 4 ) 
[4] => Array ( [id] => 5 [created] => 1418692536 [updated] => [created_by] => 1 [ordering_count] => 5 [close_hour] => Array ( [key] => 10pm [val] => 10:00 PM [value] => 10:00 PM ) [open_hour] => Array ( [key] => 2pm [val] => 02:00 PM [value] => 02:00 PM ) [day_open] => Array ( [key] => Thu [val] => Thu [value] => Thu ) [last] => 0 [odd_even] => odd [count] => 5 ) 
[5] => Array ( [id] => 6 [created] => 1418692549 [updated] => 1418698491 [created_by] => 1 [ordering_count] => 6 [close_hour] => Array ( [key] => 12am [val] => 12:00 AM [value] => 12:00 AM ) [open_hour] => Array ( [key] => 2pm [val] => 02:00 PM [value] => 02:00 PM ) [day_open] => Array ( [key] => Fri [val] => Fri [value] => Fri ) [last] => 0 [odd_even] => even [count] => 6 ) 
[6] => Array ( [id] => 7 [created] => 1418692559 [updated] => 1418698459 [created_by] => 1 [ordering_count] => 7 [close_hour] => Array ( [key] => 12am [val] => 12:00 AM [value] => 12:00 AM ) [open_hour] => Array ( [key] => 2pm [val] => 02:00 PM [value] => 02:00 PM ) [day_open] => Array ( [key] => Sat [val] => Sat [value] => Sat ) [last] => 1 [odd_even] => odd [count] => 7 )
) 
[pagination] => [total] => 7 )

【问题讨论】:

  • 显示原来的$this-&gt;entries数组。
  • 你能告诉我们你的$this->条目吗?
  • 将 var_dump 添加到原始问题中
  • 我该如何删除它?
  • 能否给出print_r格式的数组?

标签: php arrays loops multidimensional-array foreach


【解决方案1】:

和我想的一样

["pagination"]=> NULL ["total"]=> int(7)

问题是给你一个额外的行,如果你有几天,只需简单地遍历数组

if(count($entry) == 7)

这里是你的代码修改:

foreach ($entries as $entry) {

  if(count($entry) == 7)
  {
    for ($i = 0; $i < count($entry); $i++) {
        $day = $entry[$i]['day_open']['value'];
        $open = $entry[$i]['open_hour']['value'];
        $close = $entry[$i]['close_hour']['value'];
        print $day . " : " . $open . " to " . $close . "<br>";
    }
  }

【讨论】:

  • 我已经在我的脚本中为新数组提供了它。但是我的问题是从我现有的数组中获取 $days 数组
  • @user1881482,我已经修复了你的原始代码并找到了问题
【解决方案2】:

这样的?如果我正确理解了您的转储...

$days = [];
foreach ($this-entries["entries"] as $entry) {
    $days[strtolower($entry['day_open']['value'])] = [
        sprintf(
            "%s-%s", 
            substr($entry['open_hour']['value'], 0, 5), 
            substr($entry['close_hour']['value'], 0, 5)
        )
    ];
}
var_dump($days);

【讨论】:

  • @user1881482 是的。 :) 下次您可能想提供带有 json_encode 的数组转储。使测试代码更容易。
【解决方案3】:

只从那可怕的阵列中取出一些:

$oldArray = array(
    "entries"=> array(
        array( 
            "id"=>"1", 
            "created"=> 1418692508, 
            "updated"=> false, 
            "created_by"=> "1", 
            "ordering_count"=> "1",
            "close_hour" => array(
                "key"=> "10pm",
                "val"=> "10:00 PM",
                "value"=> "10:00 PM" 
            ),
            "open_hour"=> array(
                "key"=> "2pm",
                "val"=> "02:00 PM",
                "value"=> "02:00 PM"
            ),
            "day_open"=> array(
                "key"=> "Mon",
                "val"=> "Mon",
                "value"=> "Mon"
            ),
            "last"=> "0",
            "odd_even"=> "odd",
            "count"=> 1 
        ), 
        array( 
            "id"=>"1", 
            "created"=> 1418692508, 
            "updated"=> false, 
            "created_by"=> "1", 
            "ordering_count"=> "1",
            "close_hour" => array(
                "key"=> "10pm",
                "val"=> "10:00 PM",
                "value"=> "10:00 PM" 
            ),
            "open_hour"=> array(
                "key"=> "2pm",
                "val"=> "02:00 PM",
                "value"=> "02:00 PM"
            ),
            "day_open"=> array(
                "key"=> "Tues",
                "val"=> "Tues",
                "value"=> "Tues"
            ),
            "last"=> "0",
            "odd_even"=> "odd",
            "count"=> 1 
        ), 
        array( 
            "id"=>"1", 
            "created"=> 1418692508, 
            "updated"=> false, 
            "created_by"=> "1", 
            "ordering_count"=> "1",
            "close_hour" => array(
                "key"=> "10pm",
                "val"=> "10:00 PM",
                "value"=> "10:00 PM" 
            ),
            "open_hour"=> array(
                "key"=> "2pm",
                "val"=> "02:00 PM",
                "value"=> "02:00 PM"
            ),
            "day_open"=> array(
                "key"=> "Weds",
                "val"=> "Weds",
                "value"=> "Weds"
            ),
            "last"=> "0",
            "odd_even"=> "odd",
            "count"=> 1 
        ),  
    ),
    "pagination"=> NULL,
    "total"=> 7  
);
$hours = array();
foreach ($oldArray['entries'] as $e) {
        $h = '';
        if (isset($e['open_hour']['value'])) {
            $h = $e['open_hour']['value'].'-'.$e['close_hour']['value'];
        }

        $hours[$e['day_open']['value']] = array(
            $h,
        );
}
echo "<pre>";print_r($hours);

打印以下内容:

Array
(
    [Mon] => Array
        (
            [0] => 02:00 PM-10:00 PM
        )

    [Tues] => Array
        (
            [0] => 02:00 PM-10:00 PM
        )

    [Weds] => Array
        (
            [0] => 02:00 PM-10:00 PM
        )

)

【讨论】:

  • 是的,CMS 确实在我试图删除的数组中添加了很多额外的细节
猜你喜欢
  • 2016-01-30
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 2016-09-26
  • 2012-07-19
  • 1970-01-01
  • 2016-12-31
  • 2018-10-08
相关资源
最近更新 更多