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

本文探讨了两种在PHP中对数组进行排序的方法:一种是自定义的_array_sort()函数,可以按指定字段正序或反序排序;另一种是使用array_map()结合array_multisort()进行多级排序。通过性能测试,显示了array_multisort在效率上的优势,特别是在处理大量数据时。这两种方法各有特点,适用于不同的场景需求。
摘要由CSDN通过智能技术生成

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

结果不言而喻

原文:http://www.jb51.net/article/18492.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值