如何在PHP中通过数组进行解析时避免错误?
我正在尝试将用户数据从Drupal数据库迁移到Wordpress。我试图解析Drupal中的一个数据列,并对其进行重新组织,以便将其导入Wordpress数据库中需要导入的位置。Drupal中的数据列是一个序列化字符串:如何在PHP中通过数组进行解析时避免错误?,php,parsing,foreach,Php,Parsing,Foreach,我正在尝试将用户数据从Drupal数据库迁移到Wordpress。我试图解析Drupal中的一个数据列,并对其进行重新组织,以便将其导入Wordpress数据库中需要导入的位置。Drupal中的数据列是一个序列化字符串: a:12:{s:23:“会员简介”类型;s:4:“完整”;s:21:“会员小姐”添加新的;s:0:;s:18:“会员小姐”mpid;s:0:;s:25:“会员小姐”支付的金额;s:0:“会员小姐”交易编号;s:0:“s:30:“会员小姐”当前付款额;i:1;s:26:“会员小姐
a:12:{s:23:“会员简介”类型;s:4:“完整”;s:21:“会员小姐”添加新的;s:0:;s:18:“会员小姐”mpid;s:0:;s:25:“会员小姐”支付的金额;s:0:“会员小姐”交易编号;s:0:“s:30:“会员小姐”当前付款额;i:1;s:26:“会员小姐”付款额;s:24:“会员小姐”开始日期:4:{“2014”s:5:“月”s:1:“2”s:3:“日”s:2:“13”;}s:27:“女士会员资格到期”;b:0;s:24:“女士会员资格到期”;a:3:{s:4:“年”s:4:“2014”s:5:“月”s:1:“2”s:3:“日”s:2:“13”}s:20:“女士会员资格”i:3;s:7:“联系人”i:1;
我不断地发现这个错误:
Warning: Invalid argument supplied for foreach()
这是我迄今为止的代码:
$fixed = preg_replace_callback(
'/s:([0-9]+):\"(.*?)\";/',
function ($matches) { return "s:".strlen($matches[2]).':"'.$matches[2].'";'; },
$data
);
$original_array = unserialize($fixed);
foreach ($original_array as $key => $value) {
echo $value['profile_membership_type'];
};
只需强制转换到
数组
foreach ( (array) $original_array as $key => $value) {
echo $value['profile_membership_type'];
}
在迭代之前检查if条件
if(is_array($original_array) && !empty($original_array)){
foreach ($original_array as $key => $value) {
echo $value['profile_membership_type'];
}
}
您可以很容易地检查所遍历的变量是否是数组
if(isset($original_array) && is_array($original_array)) {
foreach ( $original_array as $key => $value) {
echo $value['profile_membership_type'];
}
}
编辑以包含检查以确保变量存在。您有一个php序列化字符串 我假定您问题中的前导
f
是一个输入错误,因为其余的是一个有效的序列化数组:
$array = unserialize('a:12:{s:23:"profile_membership_type";s:4:"Full";s:21:"ms_membership_add_new";s:0:"";s:18:"ms_membership_mpid";s:0:"";s:25:"ms_membership_amount_paid";s:0:"";s:32:"ms_membership_transaction_number";s:0:"";s:30:"ms_membership_current_payments";i:1;s:26:"ms_membership_max_payments";s:0:"";s:24:"ms_membership_start_date";a:3:{s:4:"year";s:4:"2014";s:5:"month";s:1:"2";s:3:"day";s:2:"13";}s:27:"ms_membership_should_expire";b:0;s:24:"ms_membership_expiration";a:3:{s:4:"year";s:4:"2014";s:5:"month";s:1:"2";s:3:"day";s:2:"13";}s:20:"ms_membership_status";i:3;s:7:"contact";i:1;}');
var_dump($array);
/*
array (size=12)
'profile_membership_type' => string 'Full' (length=4)
'ms_membership_add_new' => string '' (length=0)
'ms_membership_mpid' => string '' (length=0)
'ms_membership_amount_paid' => string '' (length=0)
'ms_membership_transaction_number' => string '' (length=0)
'ms_membership_current_payments' => int 1
'ms_membership_max_payments' => string '' (length=0)
'ms_membership_start_date' =>
array (size=3)
'year' => string '2014' (length=4)
'month' => string '2' (length=1)
'day' => string '13' (length=2)
'ms_membership_should_expire' => boolean false
'ms_membership_expiration' =>
array (size=3)
'year' => string '2014' (length=4)
'month' => string '2' (length=1)
'day' => string '13' (length=2)
'ms_membership_status' => int 3
'contact' => int 1
*/
请注意,只有一个profile\u membership\u type
元素,因此不需要循环:
echo $array['profile_membership_type']; // Full
当您不需要$key时,只需使用
foreach(数组\表达式为$value)
在迭代之前检查它是否是数组?所有的答案都是试图修复一个坏的黑客行为。真正的问题是你到底为什么要这样做?这里有一些可疑的事情……你为什么要用正则表达式处理序列化数据?是什么阻止你只是取消序列化原始未处理的数据并操作ge改为生成数据结构?我正在将用户数据从Drupal数据库迁移到Wordpress。我正在尝试从Drupal解析数据列并重新组织它,以便可以将其导入Wordpress数据库中需要导入的位置。Drupal中的数据列是序列化字符串。谢谢!这对我在取消序列化后直接使用它很有效ata。