
本文讲解如何从 json 格式的 php 数组中提取所有 name 字段,忽略大小写与 unicode 差异进行归一化处理,并准确统计频次、获取最高频名称。
本文讲解如何从 json 格式的 php 数组中提取所有 name 字段,忽略大小写与 unicode 差异进行归一化处理,并准确统计频次、获取最高频名称。
在处理用户提交或第三方接口返回的 JSON 数据时,常需分析字段分布规律——例如识别最常出现的姓名。但直接对嵌套 JSON 解码后的数组调用 array_count_values() 会报错:“Can only count STRING and INTEGER values!”,因为该函数不支持对关联数组(如整个 {"name":"...", "phone":"..."} 对象)计数。
正确做法是先使用 array_column() 提取所有 name 值构成一维字符串数组,再统计频次:
<?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');
// 统计频次(原始字符串,含大小写/Unicode 差异)
$frequencies = array_count_values($names);
// ? 获取最高频项(不归一化时,“Amr Selim” 和 “amr selim” 视为不同)
arsort($frequencies);
$mostFrequentRaw = key($frequencies);
echo "原始最高频 name: " . $mostFrequentRaw . "(出现 " . current($frequencies) . " 次)\n";
// ⚠️ 实际业务中建议归一化(如转小写 + 移除空格/标点 + Unicode 标准化)
$normalizedNames = array_map(function($name) {
return trim(strtolower(preg_replace('/[^\p{L}\p{N}\s]/u', '', $name)));
}, $names);
$normalizedFreq = array_count_values($normalizedNames);
arsort($normalizedFreq);
$mostFrequentNormalized = key($normalizedFreq);
echo "归一化后最高频 name: " . $mostFrequentNormalized . "(出现 " . current($normalizedFreq) . " 次)\n";
?>
关键注意事项:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
-
array_column($array, 'key')是提取嵌套数组中指定字段的最简洁方式; -
array_count_values()仅接受纯字符串或整数数组,不可直接传入对象数组; - 阿拉伯语、中文等 Unicode 名称需额外做标准化(如
iconv('UTF-8', 'ASCII//TRANSLIT', $str)或正则清理),否则形近字(如عمرvsعمرو)会被视为不同项; - 若需精确模糊匹配(如“Amr Selim”≈“amr selim”≈“عمر سليم”),应引入自然语言处理库(如
php-matcher或调用外部 NLP API),而非仅依赖字符串归一化。
最终,在本例数据中,经归一化处理后 "amr selim"(及其各种拼写变体)将被统一识别,成为绝对最高频名称。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










