PHP中array_push()向数组推入数据未生效的问题及解决
问题分析与解决方法
可能的原因及对应解决思路
1. JSON解析未正确转为关联数组或解析失败
- 问题点:
json_decode()默认返回对象,要是你用数组方式访问$item['jenis_cairan_masuk']['value']会直接报错,后续分类逻辑根本跑不起来;另外如果原始JSON格式不合法,json_decode()会返回null,遍历空数据自然不会有内容。 - 解决:
- 调用
json_decode()时加第二个参数true,强制转成关联数组:$cairanData = json_decode($data['tabel_cairan_masuk'], true); - 先做解析错误检查,快速定位问题:
$cairanData = json_decode($data['tabel_cairan_masuk'], true); if (json_last_error() !== JSON_ERROR_NONE) { die('JSON解析错误: ' . json_last_error_msg()); }
- 调用
2. 目标数组初始化错误或键名不匹配
- 问题点:如果
$jenis_cairan_masuk_master的键名和jenis_cairan_masuk的value值对不上,或者没预先给对应键初始化空数组,array_push()找不到目标位置,甚至直接报错。 - 解决:
- 提前把目标数组的键设置成所有需要分类的
jenis_cairan_masuk的value值,每个键对应空数组:// 示例初始化,根据实际业务调整键名 $jenis_cairan_masuk_master = [ 'air_minum' => [], 'susu' => [], 'jus' => [] ]; - 遍历前先校验当前数据的value是否在目标数组的键里,避免无效操作:
$currentType = $item['jenis_cairan_masuk']['value']; if (isset($jenis_cairan_masuk_master[$currentType])) { array_push($jenis_cairan_masuk_master[$currentType], $item); }
- 提前把目标数组的键设置成所有需要分类的
3. 遍历的数据源为空
- 问题点:
$data['tabel_cairan_masuk']本身是空字符串,或者解析后得到的$cairanData是空数组,遍历自然不会产生任何数据。 - 解决:
- 先打印原始JSON字符串确认内容:
var_dump($data['tabel_cairan_masuk']); - 确认解析后的数组非空再执行遍历:
if (!empty($cairanData)) { foreach ($cairanData as $item) { // 分类逻辑 } }
- 先打印原始JSON字符串确认内容:
4. 变量作用域问题(如果在函数中操作)
- 问题点:如果是在自定义函数里处理分类,
$jenis_cairan_masuk_master作为外部变量,没通过global声明或引用传递的话,函数内的修改不会影响外部数组。 - 解决:
- 方法一:用
global声明变量:function classifyCairan($data) { global $jenis_cairan_masuk_master; $cairanData = json_decode($data['tabel_cairan_masuk'], true); // 遍历分类逻辑 } - 方法二:通过引用传递目标数组:
function classifyCairan($data, &$targetArray) { $cairanData = json_decode($data['tabel_cairan_masuk'], true); foreach ($cairanData as $item) { $currentType = $item['jenis_cairan_masuk']['value']; if (isset($targetArray[$currentType])) { array_push($targetArray[$currentType], $item); } } } // 调用时 classifyCairan($data, $jenis_cairan_masuk_master);
- 方法一:用
完整可运行示例代码
// 初始化目标分类数组 $jenis_cairan_masuk_master = [ 'air_minum' => [], 'susu' => [], 'jus' => [] ]; // 模拟原始JSON数据 $data['tabel_cairan_masuk'] = '[ {"id":1,"jenis_cairan_masuk":{"value":"air_minum","label":"Air Minum"},"volume":500}, {"id":2,"jenis_cairan_masuk":{"value":"susu","label":"Susu"},"volume":200}, {"id":3,"jenis_cairan_masuk":{"value":"air_minum","label":"Air Minum"},"volume":300} ]'; // 解析JSON并检查错误 $cairanData = json_decode($data['tabel_cairan_masuk'], true); if (json_last_error() !== JSON_ERROR_NONE) { die('JSON解析错误: ' . json_last_error_msg()); } // 遍历分类数据 if (!empty($cairanData)) { foreach ($cairanData as $item) { // 加?? ''避免不存在value时报错 $currentType = $item['jenis_cairan_masuk']['value'] ?? ''; if (isset($jenis_cairan_masuk_master[$currentType])) { array_push($jenis_cairan_masuk_master[$currentType], $item); } } } // 输出结果 var_dump($jenis_cairan_masuk_master);
内容的提问来源于stack exchange,提问作者Bonifacius Sarumpaet
相关产品推荐
相关产品推荐

