php - 将函数应用于多维数组的每个元素

我有一个像这样的多维数组(请忽略 strlen):

array(2) {
  ["document"]=>
    array(16) {
      [0]=>
      string(14) "Value1"
      [1]=>
      string(4) "Value2"
      [2]=>
      string(30) "Value3"
  ...

我想为多维数组(文档等)的每个级别上的每个元素(Value1、Value2 等)调用“strtoupper”。

我试过 array_walk_recursive($array, "strtoupper"); 但它不起作用。但是为什么,我能做什么?

回答1

function recurse(array $array): array {
  $result = [];
  foreach ($array as $key => $value) {
    $newKey = is_string($key) ? strtoupper($key) : $key;
    if (is_array($value)) {
      $result[$newKey] = recurse($value);
    } elseif (is_string($value)) {
      $result[$newKey] = strtoupper($value);
    } else {
      $result[$newKey] = $value;
    }
  }
  return $result;
}

$array = [
    'document'  => [
        'Value1',
        'Value2',
        'Value3'
    ],
    'document2' => [
        'Value21',
        'Value22',
        'document2' => [ 'Value221', 222, 'Value223' ],
        23
    ]
];

$result = recurse($array);

print_r($result);

回答2

由于 strtoupper 不会改变原来的 value,而是返回新的 value,你应该这样做:

array_walk_recursive(
    $array, 
    // pass value by reference. 
    // Changing it will also reflect changes in original array
    function (&$value) { $value = strtoupper($value); } 
);

简单的https://3v4l.org/vOkOt

此提示也在 https://www.php.net/manual/en/function.array-walk-recursive.php#refsect1-function.array-walk-recursive-parameters 中进行了描述,请参阅关于 callback 参数说明的注释。

相似文章

随机推荐

最新文章