PHP原生函数实现多维数组转置,替代手动循环方案咨询
转置结构化多维数组:PHP原生函数方案及多语言实现
PHP 原生函数实现
不需要手动循环,PHP 提供的原生函数可以高效完成结构转换,以下是两种简洁方案:
方案一:利用array_column遍历键名
$original = [ ['id_user' => 79, 'nama' => 'Sasha', 'id_app' => 908989898], ['id_user' => 91, 'nama' => 'Edward', 'id_app' => 23232323], ['id_user' => 50, 'nama' => 'Jhon', 'id_app' => 1212121212], ]; // 获取所有键名 $keys = array_keys(current($original)); $transposed = []; foreach ($keys as $key) { // 提取每个键对应的所有值 $transposed[$key] = array_column($original, $key); } print_r($transposed);
方案二:array_map+array_combine一键转置
$original = [ ['id_user' => 79, 'nama' => 'Sasha', 'id_app' => 908989898], ['id_user' => 91, 'nama' => 'Edward', 'id_app' => 23232323], ['id_user' => 50, 'nama' => 'Jhon', 'id_app' => 1212121212], ]; // 解构原数组,用array_map转置值数组,再用array_combine绑定键名 $transposed = array_combine( array_keys($original[0]), array_map(null, ...$original) ); print_r($transposed);
其他主流语言实现
Python
利用字典推导式直接生成目标结构:
original = [ {'id_user': 79, 'nama': 'Sasha', 'id_app': 908989898}, {'id_user': 91, 'nama': 'Edward', 'id_app': 23232323}, {'id_user': 50, 'nama': 'Jhon', 'id_app': 1212121212} ] # 遍历每个键,收集所有元素对应的值 transposed = {key: [item[key] for item in original] for key in original[0]} print(transposed)
JavaScript
使用Object.fromEntries结合map实现简洁转换:
const original = [ {id_user: 79, nama: 'Sasha', id_app: 908989898}, {id_user: 91, nama: 'Edward', id_app: 23232323}, {id_user: 50, nama: 'Jhon', id_app: 1212121212} ]; // 提取键名,逐个生成键值对 const transposed = Object.fromEntries( Object.keys(original[0]).map(key => [ key, original.map(item => item[key]) ]) ); console.log(transposed);
Java
通过HashMap和computeIfAbsent方法完成转换:
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class ArrayTranspose { public static void main(String[] args) { List<Map<String, Object>> original = new ArrayList<>(); Map<String, Object> item1 = new HashMap<>(); item1.put("id_user", 79); item1.put("nama", "Sasha"); item1.put("id_app", 908989898L); original.add(item1); Map<String, Object> item2 = new HashMap<>(); item2.put("id_user", 91); item2.put("nama", "Edward"); item2.put("id_app", 23232323L); original.add(item2); Map<String, Object> item3 = new HashMap<>(); item3.put("id_user", 50); item3.put("nama", "Jhon"); item3.put("id_app", 1212121212L); original.add(item3); Map<String, List<Object>> transposed = new HashMap<>(); for (Map<String, Object> item : original) { for (Map.Entry<String, Object> entry : item.entrySet()) { // 不存在键时自动创建空列表,再添加值 transposed.computeIfAbsent(entry.getKey(), k -> new ArrayList<>()) .add(entry.getValue()); } } // 打印结果 transposed.forEach((key, valueList) -> System.out.printf("%s: %s%n", key, valueList) ); } }
内容的提问来源于stack exchange,提问作者inumaru
相关产品推荐
相关产品推荐

