php array_map处理多维,php array_map array_multisort 高效处理多维数组排序

这篇博客探讨了两种对多维数组排序的方法:一种是自定义的_array_sort函数,另一种是使用array_map和array_multisort的组合。文章通过实例展示了如何根据特定字段进行排序,并进行了性能测试。测试结果显示,使用array_map和array_multisort的方式在效率上优于自定义函数。此外,array_multisort还支持多字段排序,具备更大的灵活性。
摘要由CSDN通过智能技术生成

对多维数组排序,通用的作法是

1 获取利用排序的数据并且将其放入数组$arrSort. 其中键索引为要排序数组的索引,保证唯一性

2 利用排序函数sort等对$arrSort进行排序.

3 遍历$arrSort, 根据其索引,获取多维数组的数据,重新构造排序后的多维数组.

复制代码 代码如下:

Array

(

[0] => Array

(

[link] => test

[name] => test.rpm

[type] => file

[size] => 988.9k

[mtime] => 1185160178)

....

)

I 很久以前在网上找到的一个排序函数,谈不上高效,但很实用

复制代码 代码如下:

_array_sort($arrFile, 1, 1);//根据name字段排序

_array_sort($arrFile, 3, 1);//根据size字段排序

/*

@records 要排序的数组

@field要排序的字段,注意是数字

@reverse正序还是反序

*/

function _array_sort($records, $field, $reverse, $defaultSortField = 0)

{

$uniqueSortId = 0;

$hash = array();

$sortedRecords = array();

$tempArr = array();

$indexedArray = array();

$recordArray = array();

foreach($records as $record)

{

$uniqueSortId++;

$recordStr = implode(, $record)..$uniqueSortId;

$recordArray[] = explode(, $recordStr);

}

$primarySortIndex = count($record);

$records = $recordArray;

foreach($records as $record)

{

$hash[$record[$primarySortIndex]] = $record[$field];

}

uasort($hash, strnatcasecmp);

if($reverse)

$hash = array_reverse($hash, true);

$valueCount = array_count_values($hash);

foreach($hash as $primaryKey => $value)

{

$indexedArray[] = $primaryKey;

}

$i = 0;

foreach($hash as $primaryKey => $value)

{

$i++;

if($valueCount[$value] > 1)

{

foreach($records as $record)

{

if($primaryKey == $record[$primarySortIndex])

{

$tempArr[$record[$defaultSortField].__.$i] = $record;

break;

}

}

$index = array_search($primaryKey, $indexedArray);

if(($i == count($records)) ($value != $hash[$indexedArray[$index+1]]))

{

uksort($tempArr, strnatcasecmp);

if($reverse)

$tempArr = array_reverse($tempArr);

foreach($tempArr as $newRecs)

{

$sortedRecords [] = $newRecs;

}

$tempArr = array();

}

}

else

{

foreach($records as $record)

{

if($primaryKey == $record[$primarySortIndex])

{

$sortedRecords[] = $record;

break;

}

}

}

}

return $sortedRecords;

}

II 用array_map和array_mutisort来排序

array_mutisort还可以根据多个值来进行二次或者三次排序,这是上一个函数所不能比的.

复制代码 代码如下:

利用array_map获取要依据排序的数组

$arrField = array_map(create_function($n, return $n[size];), $arrFile);

//利用array_mutisort来进行排序

$array_multisort($arrField, SORT_DESC, $arrFile);

III 最终测试

以188条数据的数组进行测试, 排序50次求平均值.

第一种方式

0.04269016 name

0.04267142 size

第二种方式

0.001249 name

0.00083924 size

结果不言而喻

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值