PHP多维数组按列排序后如何保留原内部索引?
保留PHP多维数组排序前原索引的实现方案
方案一:提前为元素添加原索引字段
遍历原数组时,将每个元素的原始索引作为新字段(比如original_index)嵌入到元素中,排序后该字段会随元素保留,直接通过此字段即可获取原索引,方便后续关联编辑原记录。
示例代码:
// 原数组 $db = array( array("Name"=>"Beans","Price"=>"10"), array("Name"=>"Salad","Price"=>"5"), array("Name"=>"Bread","Price"=>"2"), array("Name"=>"Lime","Price"=>"1") ); // 遍历添加原索引字段 foreach ($db as $index => &$item) { $item['original_index'] = $index; } unset($item); // 释放引用,避免后续数组操作异常 // 按Price字段升序排序 array_multisort(array_column($db, 'Price'), $db); // 调用示例:获取排序后第一个元素的原索引和名称 echo $db[0]['original_index']; // 输出3(对应原数组Lime的索引) echo $db[0]['Name']; // 输出Lime
方案二:使用uasort保留原数组索引
array_multisort会默认重置数字索引,改用uasort自定义排序逻辑,可保留原数组的索引键,直接通过排序后数组的键获取原索引。
示例代码:
// 原数组 $db = array( 0 => array("Name"=>"Beans","Price"=>"10"), 1 => array("Name"=>"Salad","Price"=>"5"), 2 => array("Name"=>"Bread","Price"=>"2"), 3 => array("Name"=>"Lime","Price"=>"1") ); // 自定义排序规则,按Price升序,同时保留原索引 uasort($db, function($a, $b) { return $a['Price'] - $b['Price']; }); // 遍历输出原索引与对应数据 foreach ($db as $originalIndex => $item) { echo "原索引:{$originalIndex},名称:{$item['Name']},价格:{$item['Price']}\n"; }
方案三:同步排序原索引数组
单独生成原索引数组,在调用array_multisort时将原索引数组与目标数组一起排序,排序后的索引数组与排序后的$db位置一一对应,通过索引数组获取原索引。
示例代码:
// 原数组 $db = array( array("Name"=>"Beans","Price"=>"10"), array("Name"=>"Salad","Price"=>"5"), array("Name"=>"Bread","Price"=>"2"), array("Name"=>"Lime","Price"=>"1") ); // 生成原索引数组 $originalIndices = array_keys($db); // 同步排序Price数组、原索引数组、原数据数组 array_multisort(array_column($db, 'Price'), $originalIndices, $db); // 获取排序后第一个元素的原索引 echo $originalIndices[0]; // 输出3
方案选择建议
如果需要后续直接通过元素本身关联原记录,方案一最直观,操作成本最低;如果不需要修改原数组结构,方案二或三更适合,可避免额外字段的引入。
内容的提问来源于stack exchange,提问作者mike_s
相关产品推荐
相关产品推荐

