php - 如何停止在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"
]
解决方案
据我了解,您的正则表达式并未提取所有数据。仅返回最后一次出现的匹配数据。
您的正则表达式正在使用“m”修饰符。此修饰符表示多行输入。但是正则表达式需要使用 '^' 和 '$' 字符来指示输入的开始和结束。请参阅正则表达式模式修饰符的文档。
推荐阅读
- java - 从给定模式中选择 m 个不同对象的最快方法?
- android - LiveData + ViewModel + Room:公开查询返回的 LiveData 随时间变化(通过 fts 搜索)
- python - 如何用专门的字母打印一个字典值
- apache-spark - Spark SQL - 重新分区后分组
- python - 创建具有固定大小的窗口时,窗口大小大于特定大小
- python-3.x - 如何将此 for 循环更改为字典/列表理解?
- html - 填充未应用于角度材料中的 html 标记
- react-native - 在哪里实现导航代码以使用 redux 和 react-navigation 移动下一个屏幕
- asp.net-core - 由于请求实体太大,页面未显示。在.Net Core 2.1
- java - 在多线程情况下使用单例类并保证线程安全!(最佳实践和最佳性能)