首页 > 解决方案 > 如何停止在foreach中覆盖数组

问题描述

我正在尝试创建一个多维数组,但内部部分继续使用 foreach 中数组的最后一个值。

我将 PHP 7.3 与 Laravel 5.8 一起使用。我已经尝试为该区域做一个 foreach,然后为该位置做一个 foreach,然后在里面做一个 foreach 来获取信息。我正在使用的正则表达式是:

// Define regex for each of the required fields
$location_regex = '/----(.*)-----/m';
$total_regex = '/^.*\bTotal\b.*/m';
$age_regex = '/Age         (?:DAYS       (\d+))/m';
// Perform the regex
preg_match_all($location_regex, $message, $locations, PREG_SET_ORDER, 0);
preg_match_all($age_regex, $message, $ageMatches, PREG_SET_ORDER, 0);
preg_match_all($total_regex, $message, $totalMatches, PREG_SET_ORDER, 0);

然后当然 $ageMatches 和 $totalMatches 作为数组返回。

我正在使用正则表达式从以下纯文本电子邮件中获取值:

"""
        ELY FARM
      THE ADDRESS
  BW8010 2.55  UNIT 1

Logged   03 JUN 19 23:59

     SUMMARY REPORT

----UNIT 1  PERCH 1-----
     House 1, Pen 1

Age         DAYS       7
Total               3997
Average     GMS       64
Deviation   GMS       14
Evenness    %         29
C.V.        %       21.9
Daily gain  GMS        9

----UNIT 1  PERCH 2-----
     House 1, Pen 2

Age         DAYS       7
Total               3849
Average     GMS       73
Deviation   GMS       17
Evenness    %         29
C.V.        %       23.3
Daily gain  GMS        9

----UNIT 1  PERCH 9-----
     House 3, Pen 3

Age         DAYS       7
Total               3614
Average     GMS       67
Deviation   GMS       16
Evenness    %         23
C.V.        %       23.9
Daily gain  GMS        8


我拥有的数据是

    // Go through each message
            foreach ($aMessage as $oMessage) {
                // Get address from email subject
                $address = $oMessage->getSubject(true);

                // Add the address to an array
                $email_data = array($address);

                // Add the sub location to each address in the array
                foreach ($locations as $location) {
                    $email_data[$address][$location[1]] = array();

                    // Add the data to the sub location in the array
                    foreach ($ageMatches as $ageIndex => $age) {
                        $email_data[$address][$location[1]]['Age'] = $age[1];
                    }
                    foreach ($totalMatches as $totalIndex => $total) {
                        $total['Total'] = preg_replace('/[^0-9]/', '', $total);
                        $email_data[$address][$location[1]]['Total'] = $total['Total'][0];
                    }
                }
            dd($email_data);
            }

当前输出为:

array:2 [▼
  0 => "Ely Farm"
  "Ely Farm" => array:10 [▼
    "UNIT 1  PERCH 1" => array:7 [▼
      "Age" => "7"
      "Total" => "3614"
      "Average" => "67"
      "Deviation" => "16"
      "Evenness" => "23"
      "C.V." => "..23.9"
      "Daily Gain" => "8"
    ]
    "UNIT 1  PERCH 2" => array:7 [▼
      "Age" => "7"
      "Total" => "3614"
      "Average" => "67"
      "Deviation" => "16"
      "Evenness" => "23"
      "C.V." => "..23.9"
      "Daily Gain" => "8"
    ]

我期望得到:

array:2 [▼
  0 => "Ely Farm"
  "Ely Farm" => array:10 [▼
    "UNIT 1  PERCH 1" => array:7 [▼
      "Age" => "7"
      "Total" => "3997"
      "Average" => "64"
      "Deviation" => "14"
      "Evenness" => "29"
      "C.V." => "..21.9"
      "Daily Gain" => "9"
    ]
    "UNIT 1  PERCH 2" => array:7 [▼
      "Age" => "7"
      "Total" => "3849"
      "Average" => "73"
      "Deviation" => "17"
      "Evenness" => "29"
      "C.V." => "..23.9"
      "Daily Gain" => "9"
    ]

标签: phparraysregexforeach

解决方案


据我了解,您的正则表达式并未提取所有数据。仅返回最后一次出现的匹配数据。

您的正则表达式正在使用“m”修饰符。此修饰符表示多行输入。但是正则表达式需要使用 '^' 和 '$' 字符来指示输入的开始和结束。请参阅正则表达式模式修饰符的文档。


推荐阅读