如何在PHP中通过数组进行解析时避免错误?

如何在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:“会员小姐

我正在尝试将用户数据从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:“会员小姐”付款额;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。