如何合并从数据库获取的多维数组为一维数组?
问题
从数据库获取用户权限码时返回了多维数组,需要将其合并为一维数组并按顺序排列,且无法修改存储过程的查询语句。
原代码
function loadGlobalPermissions(){ global $pdo; $user_id = $_SESSION['id']; $sql="CALL skaj_listp(:user_id)"; $statement = $pdo->prepare($sql); $statement->bindParam(':user_id',$user_id,PDO::PARAM_STR); if($statement->execute()){ $response[] = $statement->fetchALL(PDO::FETCH_ASSOC); } return $response; }
返回的多维数组
array(1) { [0]=> array(1) { [0]=> array(28) { [0]=> array(1) { ["kod"]=> string(2) "DR" } [1]=> array(1) { ["kod"]=> string(3) "DRW" } [2]=> array(1) { ["kod"]=> string(2) "ER" } [3]=> array(1) { ["kod"]=> string(4) "ERDD" } [4]=> array(1) { ["kod"]=> string(5) "ERDSP" } [5]=> array(1) { ["kod"]=> string(4) "ERED" } [6]=> array(1) { ["kod"]=> string(5) "EREFP" } [7]=> array(1) { ["kod"]=> string(4) "EREM" } [8]=> array(1) { ["kod"]=> string(5) "EREMA" } [9]=> array(1) { ["kod"]=> string(4) "EREO" } [10]=> array(1) { ["kod"]=> string(4) "EREP" } [11]=> array(1) { ["kod"]=> string(4) "ERES" } [12]=> array(1) { ["kod"]=> string(4) "ERET" } [13]=> array(1) { ["kod"]=> string(4) "EREU" } [14]=> array(1) { ["kod"]=> string(5) "EREWM" } [15]=> array(1) { ["kod"]=> string(4) "ERUD" } [16]=> array(1) { ["kod"]=> string(5) "ERUSP" } [17]=> array(1) { ["kod"]=> string(2) "EU" } [18]=> array(1) { ["kod"]=> string(3) "EUS" } [19]=> array(1) { ["kod"]=> string(6) "EUSEUP" } [20]=> array(1) { ["kod"]=> string(3) "EWR" } [21]=> array(1) { ["kod"]=> string(3) "LRW" } [22]=> array(1) { ["kod"]=> string(5) "LUDDG" } [23]=> array(1) { ["kod"]=> string(5) "LUUZG" } [24]=> array(1) { ["kod"]=> string(3) "LUW" } [25]=> array(1) { ["kod"]=> string(2) "UR" } [26]=> array(1) { ["kod"]=> string(2) "UW" } [27]=> array(1) { ["kod"]=> string(3) "WPA" } } } }
解决方案
方式一:修改原函数直接返回排序后的一维数组
调整函数逻辑,拆解多维数组提取kod值,再进行排序:
function loadGlobalPermissions(){ global $pdo; $user_id = $_SESSION['id']; $sql="CALL skaj_listp(:user_id)"; $statement = $pdo->prepare($sql); $statement->bindParam(':user_id',$user_id,PDO::PARAM_STR); $permissionCodes = []; if($statement->execute()){ // 获取存储过程返回的结果集 $result = $statement->fetchAll(PDO::FETCH_ASSOC); // 拆解嵌套数组,提取所有权限码 if (!empty($result[0][0])) { foreach ($result[0][0] as $item) { if (isset($item['kod'])) { $permissionCodes[] = $item['kod']; } } } // 按字符串顺序排序权限码 sort($permissionCodes); } return $permissionCodes; }
方式二:调用原函数后再处理结果
如果不想修改原函数,可在调用后对返回的多维数组进行扁平化和排序:
// 调用原函数获取原始多维数组 $rawPermissions = loadGlobalPermissions(); $permissionCodes = []; // 拆解嵌套数组提取权限码 if (!empty($rawPermissions[0][0][0])) { foreach ($rawPermissions[0][0][0] as $item) { if (isset($item['kod'])) { $permissionCodes[] = $item['kod']; } } } // 按字符串顺序排序 sort($permissionCodes); // 此时$permissionCodes即为排序后的一维权限码数组
说明
- 原数组是三层嵌套结构,需要逐层访问到包含
kod的最内层元素; - 使用
sort()函数可实现权限码的自然字符串排序,若需要不区分大小写排序可改用natcasesort(); - 代码中加入了非空判断,避免因结果集为空导致的报错。
内容的提问来源于stack exchange,提问作者zirson
相关产品推荐
相关产品推荐

