PHP数组类函数

来源:互联网 发布:软件项目售后服务承诺 编辑:程序博客网 时间:2024/05/18 00:55

最近在阅读<PHP经典实例>, 已经读到数组处理的章节了, 其中一些比较实用的实例手动实现了一下, 算是做个联系和笔记吧.

<?php/**  * @author jixiaolong *  *  */class OAArray {function __construct() {}/** *  */function __destruct() {}/** * @author jixiaolong 2013-12-13下午05:42:02 * @todo 支持先对元素预处理的数组排序函数, 效率高于usort * @param array $array * @param callback $map_func 数组预处理函数 * @param callback $cmp_function 用户预定义比较函数 * @return array 排序后的数组 */public static function sort($array, $map_func, $cmp_function = '') {//预处理数组(保留原有键值)$preDealedArray = array_map ( $map_func, $array );//排序(保留原有键值)if ('' == $cmp_function) {$sortRes = asort ( $preDealedArray );} else {$sortRes = uasort ( $preDealedArray, $cmp_function );}if (! $sortRes) {$message = "排序出错";throw new Exception ( $message, 0, null );}//返回排序结果$sortedArray = array ();while ( list ( $key ) = each ( $preDealedArray ) ) {//预处理后value已经发生变化,所以采用原数组的value返回$sortedArray [] = $array [$key];}return $sortedArray;}/** * @author jixiaolong 2013-12-18下午05:45:03 * @todo 求2个数组的并集 * @param array $arr1 数组1 * @param array $arr2 数组2 * @return array */public static function union(&$arr1, &$arr2) {return array_unique ( array_merge ( $arr1, $arr2 ) );}/** * @author jixiaolong 2013-12-18下午05:55:25 * @todo 判断两个数组是否相等 (不考虑key) * @return boolean */public static function equal(&$arr1 , &$arr2){$map1 = array();//创建arr1的关系数组foreach ($arr1 as $val1){$map1[$val1]++;}//创建arr2的关系数组$map2 = array();foreach ($arr2 as $val2){$map2[$val2]++;}//检测差异元素的数目是否相等$len1 = count($map1);$len2 = count($map2);if ($len1 != $len2){return false;}foreach ($map1 as $val1=>$times1){//检测有无该元素if (!array_key_exists($val1, $map2)){return false;}//检测元素出现次数是否相等if ($times1 != $map2[$val1]){return false;}}return true;}}

一并附上simple test的测试用例

<?phprequire_once '../../../fmis_test.inc.php';require_once(SIMPLE_TEST_PATH.'autorun.php');require_once(SIMPLE_TEST_PATH.'unit_tester.php');require_once WEB_PATH.'include/util/OAArray.cls.php';/**  * @author jixiaolong *  *  */class TestOAArray extends UnitTestCase {/** *  * @param  string $label     Name of test case. Will usethe class name if none specified.  * @access  public       */public function __construct($label = false) {parent::__construct ( $label = false );}/** *  */function __destruct() {}public function testUnion(){$arr1 = array('11','ss','cc');$arr2 = array('s','cc','1','s');$arr3 = array('11','ss','cc','s','1');$res = OAArray::union($arr1, $arr2);$res = OAArray::equal($res, $arr3);$this->assertTrue($res);}public function testEqual(){$arr1 = array('11','ss','cc');$arr2 = array('s','cc','1','s');$arr3 = array('11','ss','cc','s','1');$arr4 = array('ss','cc','11');$arr5 = array('s',1,'cc','s');$arr6 = array('s','cc','1');$arr7 = array('s','cc',1);$res1 = OAArray::equal($arr1, $arr2);$res2 = OAArray::equal($arr1, $arr4);$res3 = OAArray::equal($arr2, $arr5);$res4 = OAArray::equal($arr2, $arr6);$res5 = OAArray::equal($arr6, $arr7);$this->assertFalse($res1);$this->assertTrue($res2);$this->assertTrue($res3);$this->assertFalse($res4);$this->assertTrue($res5);}}?>


0 0
原创粉丝点击