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

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

用array_map和array_multisort高效处理多维数组排序的实现代码。

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

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