PHP在使用array_map,array_walk等函数时应用多个回调函数

时间:2017-09-04 08:55:03

标签: php arrays serialization array-map

我遇到了一系列序列化值,如下所示:

expect(page).to have_xpath("//a[contains(@href,'mailto:some_name@google.com')]")

现在我需要按指定顺序应用两个函数,Array ( [primary] => Array ( [key_type_0_key_name] => a:1:{i:0;s:5:"27232";} [key_type_1_key_name] => a:1:{i:0;s:5:"27231";} [key_type_2_key_name] => a:1:{i:0;s:5:"27147";} [key_type_3_key_name] => a:1:{i:0;s:5:"27157";} ) [additional] => Array ( [key_type_0_key_othername] => a:1:{i:0;s:5:"27169";} [key_type_1_key_othername] => a:1:{i:0;s:5:"27160";} [key_type_2_key_othername] => a:1:{i:0;s:5:"27103";} [key_type_3_key_othername] => a:1:{i:0;s:5:"27149";} ) ) unserialize来提取标量值,如array_shift并存储在另一个27169,我该怎么办?在array一次通过中执行此操作,或者我必须强制执行array_map两次?

还有一个问题是递归,只有array_map正确处理递归,但在我的情况下,如果我尝试下面的代码,我得到给定的错误:

array_walk_recursive

错误:

return array_walk_recursive($array, function ( &$value ) {
        $value = array_shift( unserialize( $value ) );
    });

预期结果:

 Strict Standards: Only variables should be passed by reference in /path/to/file.php on line 367

2 个答案:

答案 0 :(得分:2)

没有调用array_map。

<?php

$data = [
    'primary' =>
    [
        'a:1:{i:0;s:5:"27232";}',
        'a:1:{i:0;s:5:"27231";}',
        'a:1:{i:0;s:5:"27147";}',
        'a:1:{i:0;s:5:"27157";}'
    ],
    'additional' =>
    [
        'a:1:{i:0;s:5:"27169";}',
        'a:1:{i:0;s:5:"27160";}',
        'a:1:{i:0;s:5:"27103";}',
        'a:1:{i:0;s:5:"27149";}'
    ]
];



$numbers = [];
foreach($data as $key=>$value) {
    foreach($value as $k=>$v) {
        $unserialized = unserialize($v);
        $numbers[$key][] = (int) array_shift($unserialized);
    }
}

var_dump($numbers);

输出:

array (size=2)
  'primary' => 
    array (size=4)
      0 => int 27232
      1 => int 27231
      2 => int 27147
      3 => int 27157
  'additional' => 
    array (size=4)
      0 => int 27169
      1 => int 27160
      2 => int 27103
      3 => int 27149

这是一个带有三个array_map调用的变异array_walk示例。在我看来,阅读起来更加丑陋,更难以阅读,但每个人都有自己的想法:

array_walk($data, function(&$v) {
        $v = array_map('intval', array_map('array_shift', array_map('unserialize', $v)));
    }
);
var_dump($data);

输出:

    array (size=2)
      'primary' => 
        array (size=4)
          0 => int 27232
          1 => int 27231
          2 => int 27147
          3 => int 27157
      'additional' => 
        array (size=4)
          0 => int 27169
          1 => int 27160
          2 => int 27103
          3 => int 27149

答案 1 :(得分:1)

请允许我回答被问到的问题。是的,是的,你可以......而你几乎拥有它!

您只需要更改访问该值的方式。将array_shift()来电替换为[0] - 这可以消除严格标准错误。

代码:(Demo

$array=[
    'primary' =>
    [
        'a:1:{i:0;s:5:"27232";}',
        'a:1:{i:0;s:5:"27231";}',
        'a:1:{i:0;s:5:"27147";}',
        'a:1:{i:0;s:5:"27157";}'
    ],
    'additional' =>
    [
        'a:1:{i:0;s:5:"27169";}',
        'a:1:{i:0;s:5:"27160";}',
        'a:1:{i:0;s:5:"27103";}',
        'a:1:{i:0;s:5:"27149";}'
    ]
];
array_walk_recursive($array,function(&$v){$v=unserialize($v)[0];});
var_export($array);

输出:

array (
  'primary' => 
  array (
    0 => '27232',
    1 => '27231',
    2 => '27147',
    3 => '27157',
  ),
  'additional' => 
  array (
    0 => '27169',
    1 => '27160',
    2 => '27103',
    3 => '27149',
  ),
)