
本文介绍如何从 json 格式的 php 数组中提取所有 name 字段,忽略大小写与常见变体(如空格、unicode 等),准确统计并获取出现频次最高的姓名。核心在于正确提取字段、规范化处理及高效计数。
本文介绍如何从 json 格式的 php 数组中提取所有 name 字段,忽略大小写与常见变体(如空格、unicode 等),准确统计并获取出现频次最高的姓名。核心在于正确提取字段、规范化处理及高效计数。
在处理用户提交或外部导入的 JSON 数据时,常需识别高频姓名(例如用于去重、聚类或数据清洗)。但直接对嵌套数组调用 array_count_values() 会报错:"Can only count STRING and INTEGER values!",因为该函数不支持对关联数组(如 ["name"=>"Amr Selim", "phone"=>"12345"])进行计数。
正确做法是先提取所有 name 值构成一维字符串数组,再统计频次。PHP 提供了简洁高效的内置函数组合:
<?php $mydata = '[{"data":[{"name":"amr selim","phone":"12345"},
{"name":"ame selim","phone":"12345"},
{"name":"\u0639\u0645\u0631\u0648 \u0633\u0644\u064a\u0645","phone":"12345"},
{"name":"Amr Selim","phone":"12345"},{"name":"3mr","phone":"12345"},
{"name":"x","phone":"12345"},{"name":"\u0639\u0645\u0631\u0648\u0633\u0644\u064a\u0645","phone":"12345"},
{"name":"mr ","phone":"12345"},
{"name":"Amr sleem","phone":"12345"},
{"name":"\u0627\u0641\u0647\u0645 \u0643\u0645\u0628\u064a\u0648\u062a\u0631","phone":"12345"},{"name":"\u0639\u0645\u0631\u0648 \u0633\u0644\u064a\u0645\u0627\u0641\u0647\u0645 \u0643\u0645\u0628\u064a\u0648\u062a\u0631","phone":"12345"},{"name":"Tv l Pc","phone":"12345"},{"name":"\u0639\u0645\u0631\u0648 \u0633\u0644\u064a\u0645","phone":"12345"},{"name":"\u0625\u0641\u0647\u0645 \u0643\u0645\u0628\u064a\u0648\u062a\u0631","phone":"12345"},{"name":"Amr Selim","phone":"12345"},{"name":"Tv pc","phone":"12345"},{"name":"\u0627\u0641\u0647\u0645 \u0643\u0645\u0628\u064a\u0648\u062a\u0631","phone":"0012345"},{"name":"Amr Selim","phone":"0012345"},{"name":"Efham Computer","phone":"0012345"},{"name":"Tv 3l Pc","phone":"0012345"},{"name":"\u0627\u0641\u0647\u0645","phone":"0012345"},{"name":"Amr Selim","phone":"12345"},{"name":"\u0627\u0641\u0647\u0645 \u0643\u0645\u0628\u064a\u0648\u062a\u0631","phone":"+12345"},{"name":"\u0627\u0641\u0647\u0645 \u0643\u0645\u0628\u064a\u0648\u062a\u0631","phone":"+12345"},{"name":"\u0645. \u0639\u0645\u0631\u0648 \u0633\u0644\u064a\u0645 \u0627\u0641\u0647\u0645 \u0643\u0645\u0628\u064a\u0648\u062a\u0631","phone":"12345"},{"name":"\u0645. \u0639\u0645\u0631\u0648 \u0633\u0644\u064a\u0645 \u0627\u0641\u0647\u0645 \u0643\u0645\u0628\u064a\u0648\u062a\u0631","phone":"12345"},{"name":"Amr Selim","phone":"12345"},{"name":"amr Selim","phone":"12345"},{"name":"amr Selim","phone":"12345"}],"info":[{"lastid":"437397286","usernum":"12345","cantry":"EG"}]}]';
$task_array = json_decode($mydata, true);
// ✅ 正确提取所有 name 值(一维字符串数组)
$names = array_column($task_array[0]['data'], 'name');
// ✅ 统计频次
$name_counts = array_count_values($names);
// ✅ 获取最高频次的 name(按值降序,取第一个键)
arsort($name_counts);
$most_frequent_name = key($name_counts);
$highest_count = current($name_counts);
echo "最高频姓名: '$most_frequent_name'(出现 $highest_count 次)\n";
// 输出示例:最高频姓名: 'Amr Selim'(出现 6 次)
?>
⚠️ 重要注意事项:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 上述代码默认区分大小写与空格(如
"Amr Selim"和"amr selim"被视为不同值)。若需模糊匹配(例如统一转小写、去除首尾空格、忽略标点),应在array_column后添加预处理:$names = array_map(function($name) { return trim(strtolower($name)); }, array_column($task_array[0]['data'], 'name')); - 对于含阿拉伯文、中文等 Unicode 字符的姓名,
strtolower()在 PHP 8+ 中默认支持多字节;若使用旧版本,请改用mb_strtolower($name, 'UTF-8')并确保mbstring扩展已启用。 - 若 JSON 结构存在多层嵌套或
data键可能缺失,建议增加健壮性检查:if (isset($task_array[0]['data']) && is_array($task_array[0]['data'])) { $names = array_column($task_array[0]['data'], 'name'); } else { die("数据格式错误:缺少有效的 data 数组"); }
综上,array_column() + array_count_values() 是解决此类问题的标准范式——它语义清晰、性能优异,且无需手动循环。配合合理归一化处理,即可精准识别真实业务场景中的高频姓名。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










