PHP数组操作类实例
本文实例讲述了PHP数组操作类。分享给大家供大家参考。具体如下:
classArrayHelper{
/**
*从数组中删除空白的元素(包括只有空白字符的元素)
*
*用法:
*@codephp
*$arr=array('','test','');
*ArrayHelper::removeEmpty($arr);
*
*dump($arr);
*//输出结果中将只有'test'
*@endcode
*
*@paramarray$arr要处理的数组
*@paramboolean$trim是否对数组元素调用trim函数
*/
staticfunctionremoveEmpty(&$arr,$trim=TRUE)
{
foreach($arras$key=>$value)
{
if(is_array($value))
{
self::removeEmpty($arr[$key]);
}
else
{
$value=trim($value);
if($value=='')
{
unset($arr[$key]);
}
elseif($trim)
{
$arr[$key]=$value;
}
}
}
}
/**
*从一个二维数组中返回指定键的所有值
*
*用法:
*@codephp
*$rows=array(
*array('id'=>1,'value'=>'1-1'),
*array('id'=>2,'value'=>'2-1'),
*);
*$values=ArrayHelper::getCols($rows,'value');
*
*dump($values);
*//输出结果为
*//array(
*//'1-1',
*//'2-1',
*//)
*@endcode
*
*@paramarray$arr数据源
*@paramstring$col要查询的键
*
*@returnarray包含指定键所有值的数组
*/
staticfunctiongetCols($arr,$col)
{
$ret=array();
foreach($arras$row)
{
if(isset($row[$col])){
$ret[]=$row[$col];
}
}
return$ret;
}
/**
*将一个二维数组转换为HashMap,并返回结果
*
*用法1:
*@codephp
*$rows=array(
*array('id'=>1,'value'=>'1-1'),
*array('id'=>2,'value'=>'2-1'),
*);
*$hashmap=ArrayHelper::toHashmap($rows,'id','value');
*
*dump($hashmap);
*//输出结果为
*//array(
*//1=>'1-1',
*//2=>'2-1',
*//)
*@endcode
*
*如果省略$valueField参数,则转换结果每一项为包含该项所有数据的数组。
*
*用法2:
*@codephp
*$rows=array(
*array('id'=>1,'value'=>'1-1'),
*array('id'=>2,'value'=>'2-1'),
*);
*$hashmap=ArrayHelper::toHashmap($rows,'id');
*
*dump($hashmap);
*//输出结果为
*//array(
*//1=>array('id'=>1,'value'=>'1-1'),
*//2=>array('id'=>2,'value'=>'2-1'),
*//)
*@endcode
*
*@paramarray$arr数据源
*@paramstring$keyField按照什么键的值进行转换
*@paramstring$valueField对应的键值
*
*@returnarray转换后的HashMap样式数组
*/
staticfunctiontoHashmap($arr,$keyField,$valueField=NULL)
{
$ret=array();
if($valueField)
{
foreach($arras$row)
{
$ret[$row[$keyField]]=$row[$valueField];
}
}
else
{
foreach($arras$row)
{
$ret[$row[$keyField]]=$row;
}
}
return$ret;
}
/**
*将一个二维数组按照指定字段的值分组
*
*用法:
*@endcode
*
*@paramarray$arr数据源
*@paramstring$keyField作为分组依据的键名
*
*@returnarray分组后的结果
*/
staticfunctiongroupBy($arr,$keyField)
{
$ret=array();
foreach($arras$row)
{
$key=$row[$keyField];
$ret[$key][]=$row;
}
return$ret;
}
/**
*将一个平面的二维数组按照指定的字段转换为树状结构
*
*
*如果要获得任意节点为根的子树,可以使用$refs参数:
*@codephp
*$refs=null;
*$tree=ArrayHelper::tree($rows,'id','parent','nodes',$refs);
*
*//输出id为3的节点及其所有子节点
*$id=3;
*dump($refs[$id]);
*@endcode
*
*@paramarray$arr数据源
*@paramstring$keyNodeId节点ID字段名
*@paramstring$keyParentId节点父ID字段名
*@paramstring$keyChildrens保存子节点的字段名
*@paramboolean$refs是否在返回结果中包含节点引用
*
*returnarray树形结构的数组
*/
staticfunctiontoTree($arr,$keyNodeId,$keyParentId='parent_id',$keyChildrens='childrens',&$refs=NULL)
{
$refs=array();
foreach($arras$offset=>$row)
{
$arr[$offset][$keyChildrens]=array();
$refs[$row[$keyNodeId]]=&$arr[$offset];
}
$tree=array();
foreach($arras$offset=>$row)
{
$parentId=$row[$keyParentId];
if($parentId)
{
if(!isset($refs[$parentId]))
{
$tree[]=&$arr[$offset];
continue;
}
$parent=&$refs[$parentId];
$parent[$keyChildrens][]=&$arr[$offset];
}
else
{
$tree[]=&$arr[$offset];
}
}
return$tree;
}
/**
*将树形数组展开为平面的数组
*
*这个方法是tree()方法的逆向操作。
*
*@paramarray$tree树形数组
*@paramstring$keyChildrens包含子节点的键名
*
*@returnarray展开后的数组
*/
staticfunctiontreeToArray($tree,$keyChildrens='childrens')
{
$ret=array();
if(isset($tree[$keyChildrens])&&is_array($tree[$keyChildrens]))
{
foreach($tree[$keyChildrens]as$child)
{
$ret=array_merge($ret,self::treeToArray($child,$keyChildrens));
}
unset($node[$keyChildrens]);
$ret[]=$tree;
}
else
{
$ret[]=$tree;
}
return$ret;
}
/**
*根据指定的键对数组排序
*
*@endcode
*
*@paramarray$array要排序的数组
*@paramstring$keyname排序的键
*@paramint$dir排序方向
*
*@returnarray排序后的数组
*/
staticfunctionsortByCol($array,$keyname,$dir=SORT_ASC)
{
returnself::sortByMultiCols($array,array($keyname=>$dir));
}
/**
*将一个二维数组按照多个列进行排序,类似SQL语句中的ORDERBY
*
*用法:
*@codephp
*$rows=ArrayHelper::sortByMultiCols($rows,array(
*'parent'=>SORT_ASC,
*'name'=>SORT_DESC,
*));
*@endcode
*
*@paramarray$rowset要排序的数组
*@paramarray$args排序的键
*
*@returnarray排序后的数组
*/
staticfunctionsortByMultiCols($rowset,$args)
{
$sortArray=array();
$sortRule='';
foreach($argsas$sortField=>$sortDir)
{
foreach($rowsetas$offset=>$row)
{
$sortArray[$sortField][$offset]=$row[$sortField];
}
$sortRule.='$sortArray[\''.$sortField.'\'],'.$sortDir.',';
}
if(empty($sortArray)||empty($sortRule)){
return$rowset;
}
eval('array_multisort('.$sortRule.'$rowset);');
return$rowset;
}
}
希望本文所述对大家的php程序设计有所帮助。