我正在编写一个脚本,该脚本处理从我不控制的第三方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_recurive是一种方法。我没能让它发挥作用,但我确实创造了一种新的方法来完成这项工作。这里是参考:
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($array, function(&$item, $key) {
if ($key === 'first_name' || $key === 'last_name') {
$item = ucwords(strtolower($item));
}
}
);
如果$key
与您想要更改的内容相匹配,这将更改现有项目(&$item
)。