0

0

PHP中如何遍历关联数组并同时获取键与值:以统计药品名称为例

DDD

DDD

发布时间:2025-11-09 11:05:23

|

1004人浏览过

|

来源于php中文网

原创

PHP中如何遍历关联数组并同时获取键与值:以统计药品名称为例

本教程将详细讲解在php中如何高效地遍历关联数组,并同时获取其键(key)和值(value)。通过一个药品名称统计的实际案例,我们将展示如何利用`foreach ($array as $key => $value)`语法解决仅能获取值而无法获取对应键的问题,从而帮助开发者在数据处理中更灵活地访问和利用数组信息。

引言:理解关联数组的遍历需求

PHP中的数组是一种功能强大的数据结构,尤其关联数组(associative array)允许我们使用有意义的字符串作为键来存储和访问数据。在许多数据处理场景中,例如对某个元素进行计数后,我们常常需要同时获取这些元素的名称(即键)和它们的计数(即值)。例如,在一个药品库存管理系统中,我们可能需要统计每种药品的数量,并根据药品名称进一步查询其详细信息。

问题剖析:为何只得到值而无法获取键?

当我们使用像array_count_values()这样的函数对数组进行统计后,通常会得到一个以原数组元素作为键、出现次数作为值的关联数组。例如,array('Ibuprofen' => 2, 'Penicillin' => 3)。

如果此时我们仅使用foreach ($array as $value)的传统方式来遍历这个结果数组,PHP会将每次迭代中当前元素的值赋给$value变量,而对应的键则无法直接访问。这在需要根据键(如药品名称)进行后续操作(如调用API获取详细信息)时,会成为一个障碍。例如,在上述药品计数的例子中,如果只用foreach ($cnt as $c),$c将依次为2和3,而Ibuprofen和Penicillin这些重要的键则无法在循环体内直接获取。

解决方案:利用foreach ($array as $key => $value)语法

PHP的foreach循环提供了一种标准且高效的语法来同时访问关联数组的键和值:foreach ($array as $key => $value)。

立即学习PHP免费学习笔记(深入)”;

飞书多维表格
飞书多维表格

表格形态的AI工作流搭建工具,支持批量化的AI创作与分析任务,接入DeepSeek R1满血版

下载

在这个语法中,每次迭代时,当前元素的键会被赋给$key变量,而值则会被赋给$value变量。这使得我们可以在循环体内同时使用键和值进行任何所需的逻辑处理、数据展示或API调用。

实战演练:药品名称统计与信息提取

为了更好地理解这一概念,我们通过一个具体的药品名称统计案例来演示。假设我们有两个数组:一个包含原始的药品名称列表,另一个包含更详细的药品信息。我们的目标是统计重复出现的药品名称及其次数,并能够同时获取名称和次数。

原始数据示例:

<?php

// 原始药品名称列表
$name = array (
    0 => 'Ibuprofen',
    1 => 'Ibuprofen',
    2 => 'Penicillin',
    3 => 'Penicillin',
    4 => 'Penicillin',
    5 => 'Adderall',
);

// 包含详细信息的药品列表(其中med_name是药品名称)
$mednames = array (
    0 => array ( 'name' => 'xxxx1', 'med_name' => 'Ibuprofen', ),
    1 => array ( 'name' => 'xxxx2', 'med_name' => 'Ibuprofen', ),
    2 => array ( 'name' => 'xxxx3', 'med_name' => 'Penicillin', ),
    3 => array ( 'name' => 'xxxx4', 'med_name' => 'Penicillin', ),
    4 => array ( 'name' => 'xxxx5', 'med_name' => 'Penicillin', ),
    5 => array ( 'name' => 'xxxx6', 'med_name' => 'Adderall', ),
);

// 步骤1: 识别并收集重复的药品名称
$duplicaten = [];
foreach ($name as $n) {
  // 遍历$mednames,检查$n是否存在于任何一个药品的'med_name'字段中
  foreach ($mednames as $med) {
    if (isset($med['med_name']) && $n === $med['med_name']) {
      $duplicaten[] = $n;
      break; // 找到匹配项后,跳出内层循环,避免重复添加
    }
  }
}

// 步骤2: 统计每个药品名称的出现次数
// $cnt 将是一个关联数组,键是药品名称,值是出现次数
$cnt = array_count_values($duplicaten);

// 此时 $cnt 的内容类似:
// Array
// (
//     [Ibuprofen] => 2
//     [Penicillin] => 3
//     [Adderall] => 1
// )

echo "<h3>药品名称及其出现次数:</h3>";

// 步骤3: 遍历统计结果,同时获取药品名称(键)和出现次数(值)
foreach ($cnt as $medicineName => $count) {
  // 在这里,$medicineName 变量包含了药品的名称(如 'Ibuprofen')
  // $count 变量包含了该药品出现的次数(如 2)

  // 示例:只显示出现次数大于1的药品
  if ($count > 1) {
    echo '<p style="color: gray;">药品名称: ' . $medicineName . ',出现次数: ' . $count . '</p>';
    // 如果需要,可以在这里根据 $medicineName 调用API获取更多信息
    // 例如: $api_info = call_medicine_api($medicineName);
  }
}

?>

代码解析:

  1. 数据初始化: 定义了$name和$mednames两个示例数组,模拟实际应用中的数据结构。
  2. 识别重复项: 第一个嵌套foreach循环用于从$name数组中筛选出在$mednames数组的med_name字段中存在的药品名称,并将它们收集到$duplicaten数组中。这里我们优化了原始问题中的in_array用法,直接比较med_name字段,使其意图更明确。
  3. 统计出现次数: array_count_values($duplicaten)函数是PHP内置的,用于统计数组中每个值出现的次数,并返回一个以值为键、次数为值的关联数组。
  4. 遍历并获取键值: 关键在于最后一个foreach ($cnt as $medicineName => $count)循环。
    • $medicineName变量在每次迭代中都会接收当前元素的键(即药品名称)。
    • $count变量则接收当前元素的值(即该药品名称的出现次数)。
    • 这样,我们就可以在循环体内同时利用药品名称和其计数进行逻辑判断和输出。

注意事项与最佳实践

  1. 变量命名: 使用清晰、有意义的变量名(如$medicineName、$count)可以极大地提高代码的可读性和可维护性,避免混淆。
  2. 性能考量: 对于极大型数组的嵌套循环,性能可能成为一个问题。在实际应用中,如果数据量巨大,可以考虑优化数据结构(例如,将$mednames预处理成以med_name为键的哈希表,以便快速查找),或使用更高效的算法。然而,对于array_count_values的结果,foreach遍历通常是高效且标准的做法。
  3. 数据类型与存在性检查: 在访问数组元素(如$med['med_name'])时,最好进行isset()检查,以防止因键不存在而导致的PHP警告或错误。
  4. 错误处理: 当从外部API获取数据时,务必加入适当的错误处理机制,例如检查API响应是否成功、数据格式是否符合预期等。

总结

通过掌握foreach ($array as $key => $value)这一PHP核心语法,开发者能够灵活高效地处理关联数组,同时访问其键和值。这对于数据统计结果的展示、基于键值进行进一步逻辑处理、或者需要根据键来获取更多相关信息的场景(如本例中根据药品名称调用API)都至关重要。在编写代码时,注重清晰的变量命名和适当的循环结构,将有助于构建更健壮、可维护的应用程序。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

337

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

224

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

138

2026.02.12

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

203

2023.11.20

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

267

2025.12.04

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1566

2023.10.24

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.4万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号