【问题标题】:Apply PHP function to specific keys in an array将 PHP 函数应用于数组中的特定键
【发布时间】:2016-09-06 02:14:52
【问题描述】:

我正在编写一个脚本来处理从我无法控制的第三方 Web 服务提交的数据。我需要清理一些用户提交的数据。具体来说,我需要遍历每个数组并重新格式化所有名字和姓氏,以确保它们正确大写(Ernest Hemingway 而不是 ERnest HEMINGWAY)。

我一直在使用 ucwords(strtolower()) 来修复大写,但我需要将该方法应用于存储在每个数组中的 first_name 和 last_name 键中的所有值。还有其他字符串我不想更改,只有 first_name 和 last_name 值。这是数组的一个示例:

Array 
(
    [authors] => Array
            (
                [0] => Array
                    (
                        [first_name] => Ernest
                        [last_name] => HEMINGWAY
                        [book] => Too many to mention, but I like the Sun Also Rises 
                [1] => Array
                    (
                        [first_name] => john
                        [last_name] => steinbeck
                        [book] => East of Eden
    )

    [actors] => Array
            (
                [0] => Array
                    (
                        [first_name] => jOhn
                        [last_name] => WAYNE
                        [occupation] => Just generally a bad dude. 
                [1] => Array
                    (
                        [first_name] => clint
                        [last_name] => eastwood
                        [occupation] => Go ahead. Make my day. 
    )
)

关于如何遍历每个数组并将 ucwords(strtolower()) 仅应用于 first_name 和 last_name 值的任何想法?有很多数组需要这个,所以我希望能够以编程方式查找和格式化 first_name 和 last_name 值。数组格式需要相同的后处理,只是改变了值。

编辑:我确信,如下所示,array_walk_recursive 是要走的路。我无法让它工作,但我确实创建了一种新方法来完成这项工作。供参考:

protected function _fixCase(array $data)
{
    $newData = $data; 
    foreach  ($newData as $key => $value) {
        switch (true) {
            case stristr($key, 'first_name') || stristr($key, 'last_name'); 
                $newData[$key] = ucwords(strtolower($value)); 
                break; 
            default: 
                ''; 
        }
    }
    return $newData;
}

【问题讨论】:

  • 你可能想看看array_walk_recursive。您在回调函数中获得的第二个参数将是关键,因此在应用清理之前检查该参数是否等于first_namelast_namephp.net/manual/en/function.array-walk-recursive.php
  • 请记住,并非所有名称都会以这种方式正确大写。

标签: php arrays


【解决方案1】:

Recursively walk the array with a callback:

array_walk_recursive($array, function(&$item, $key) {
        if ($key === 'first_name' || $key === 'last_name') {
            $item = ucwords(strtolower($item));
        }
    }
);

如果$key 与您要更改的内容匹配,这将更改现有的项目 (&$item)。

【讨论】:

  • 这让我的评论有点多余......有思想和伟大的东西;)
  • 感谢您的信息。我无法让 array_walk_recursive 工作,但我确信这是由于我自己的限制。我最终创建了一个可能不太优雅的函数,但完成了工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
相关资源
最近更新 更多