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

PHP Apply multiple callback functions when using array_map, array_walk etc. functions

我遇到了如下序列化值数组:

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";}
        )
)

现在我需要按指定顺序应用两个函数,即 unserializearray_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

预期结果:

Array
(
    [primary] => Array
        (
            27232
            27231
            27147
            27157
        )

    [additional] => Array
        (
            27169
            27160
            27103
            27149
        )
)

没有调用 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

请允许我回答被问到的问题。是的,是的,你可以...而且你几乎成功了!

您只需要更改访问值的方式。用 [0] 替换 array_shift() 调用——这消除了严格标准错误。

代码:(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',
  ),
)