数组操纵类

    添加时间:2013-7-3 点击量:

    class ArrayHelper{
    

    /
    从数组中删除空白的元素(包含只有空白字符的元素)

    用法:
    @code php
    ¥arr = array(, test, );
    ArrayHelper::removeEmpty(¥arr);

    dump(¥arr);
    // 输出成果中将只有 test
    @endcode

    @param array ¥arr 要处理惩罚的数组
    @param boolean ¥trim 是否对数组元素调用 trim 函数
    /
    static function removeEmpty(& ¥arr¥trim = TRUE
    {
    foreach¥arr as ¥key => ¥value
    {
    ifis_array¥value))
    {
    self
    ::removeEmpty(¥arr[¥key]);
    }
    else
    {
    ¥value = trim¥value);
    if¥value ==
    {
    unset¥arr[¥key]);
    }
    elseif¥trim
    {
    ¥arr[¥key] = ¥value;
    }
    }
    }
    }

    /
    从一个二维数组中返回指定键的所有值

    用法:
    @code php
    ¥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

    @param array ¥arr 数据源
    @param string ¥col 要查询的键

    @return array 包含指定键所有值的数组
    /
    static function getCols(¥arr¥col
    {
    ¥ret = array();
    foreach¥arr as ¥row
    {
    ifisset¥row[¥col])) {
    ¥ret[] = ¥row[¥col];
    }
    }
    return ¥ret;
    }

    /
    将一个二维数组转换为 HashMap,并返回成果

    用法1:
    @code php
    ¥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:
    @code php
    ¥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

    @param array ¥arr 数据源
    @param string ¥keyField 遵守什么键的值进行转换
    @param string ¥valueField 对应的键值

    @return array 转换后的 HashMap 样式数组
    /
    static function toHashmap(¥arr¥keyField¥valueField = NULL
    {
    ¥ret = array();
    if¥valueField
    {
    foreach¥arr as ¥row
    {
    ¥ret[¥row[¥keyField]] = ¥row[¥valueField];
    }
    }
    else
    {
    foreach¥arr as ¥row
    {
    ¥ret[¥row[¥keyField]] = ¥row;
    }
    }
    return ¥ret;
    }

    /
    将一个二维数组遵守指定字段的值分组

    用法:
    @code php
    ¥rows = array(
    array(id => 1, value => 1-1, parent => 1),
    array(id => 2, value => 2-1, parent => 1),
    array(id => 3, value => 3-1, parent => 1),
    array(id => 4, value => 4-1, parent => 2),
    array(id => 5, value => 5-1, parent => 2),
    array(id => 6, value => 6-1, parent => 3),
    );
    ¥values = ArrayHelper::groupBy(¥rows, parent);

    dump(¥values);
    // 遵守 parent 分组的输出成果为
    // array(
    // 1 => array(
    // array(id => 1, value => 1-1, parent => 1),
    // array(id => 2, value => 2-1, parent => 1),
    // array(id => 3, value => 3-1, parent => 1),
    // ),
    // 2 => array(
    // array(id => 4, value => 4-1, parent => 2),
    // array(id => 5, value => 5-1, parent => 2),
    // ),
    // 3 => array(
    // array(id => 6, value => 6-1, parent => 3),
    // ),
    // )
    @endcode

    @param array ¥arr 数据源
    @param string ¥keyField 作为分组根据的键名

    @return array 分组后的成果
    /
    static function groupBy(¥arr¥keyField
    {
    ¥ret = array();
    foreach¥arr as ¥row
    {
    ¥key = ¥row[¥keyField];
    ¥ret[¥key][] = ¥row;
    }
    return ¥ret;
    }

    /
    将一个平面的二维数组遵守指定的字段转换为树状布局

    用法:
    @code php
    ¥rows = array(
    array(id => 1, value => 1-1, parent => 0),
    array(id => 2, value => 2-1, parent => 0),
    array(id => 3, value => 3-1, parent => 0),

    array(id => 7, value => 2-1-1, parent => 2),
    array(id => 8, value => 2-1-2, parent => 2),
    array(id => 9, value => 3-1-1, parent => 3),
    array(id => 10, value => 3-1-1-1, parent => 9),
    );

    ¥tree = ArrayHelper::tree(¥rows, id, parent, nodes);

    dump(¥tree);
    // 输出成果为:
    // array(
    // array(id => 1, ..., nodes => array()),
    // array(id => 2, ..., nodes => array(
    // array(..., parent => 2, nodes => array()),
    // array(..., parent => 2, nodes => array()),
    // ),
    // array(id => 3, ..., nodes => array(
    // array(id => 9, ..., parent => 3, nodes => array(
    // array(..., , parent => 9, nodes => array(),
    // ),
    // ),
    // )
    @endcode

    若是要获得随便率性节点为根的子树,可以应用 ¥refs 参数:
    @code php
    ¥refs = null;
    ¥tree = ArrayHelper::tree(¥rows, id, parent, nodes, ¥refs);

    // 输出 id 为 3 的节点及其所有子节点
    ¥id = 3;
    dump(¥refs[¥id]);
    @endcode

    @param array ¥arr 数据源
    @param string ¥keyNodeId 节点ID字段名
    @param string ¥keyParentId 节点父ID字段名
    @param string ¥keyChildrens 保存子节点的字段名
    @param boolean ¥refs 是否在返回成果中包含节点引用

    return array 树形布局的数组
    /
    static function toTree(¥arr¥keyNodeId¥keyParentId = parent_id, ¥keyChildrens = childrens, & ¥refs = NULL
    {
    ¥refs = array();
    foreach¥arr as ¥offset => ¥row
    {
    ¥arr[¥offset][¥keyChildrens] = array();
    ¥refs[¥row[¥keyNodeId]] =& ¥arr[¥offset];
    }

    ¥tree = array();
    foreach¥arr as ¥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() 办法的逆向操纵。

    @param array ¥tree 树形数组
    @param string ¥keyChildrens 包含子节点的键名

    @return array 展开后的数组
    /
    static function treeToArray(¥tree¥keyChildrens = childrens
    {
    ¥ret = array();
    ifisset¥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;
    }

    /
    按照指定的键对数组排序

    用法:
    @code php
    ¥rows = array(
    array(id => 1, value => 1-1, parent => 1),
    array(id => 2, value => 2-1, parent => 1),
    array(id => 3, value => 3-1, parent => 1),
    array(id => 4, value => 4-1, parent => 2),
    array(id => 5, value => 5-1, parent => 2),
    array(id => 6, value => 6-1, parent => 3),
    );

    ¥rows = ArrayHelper::sortByCol(¥rows, id, SORT_DESC);
    dump(¥rows);
    // 输出成果为:
    // array(
    // array(id => 6, value => 6-1, parent => 3),
    // array(id => 5, value => 5-1, parent => 2),
    // array(id => 4, value => 4-1, parent => 2),
    // array(id => 3, value => 3-1, parent => 1),
    // array(id => 2, value => 2-1, parent => 1),
    // array(id => 1, value => 1-1, parent => 1),
    // )
    @endcode

    @param array ¥array 要排序的数组
    @param string ¥keyname 排序的键
    @param int ¥dir 排序标的目标

    @return array 排序后的数组
    /
    static function sortByCol(¥array¥keyname¥dir = SORT_ASC)
    {
    return self::sortByMultiCols(¥arrayarray¥keyname => ¥dir));
    }

    /
    将一个二维数组遵守多个列进行排序,类似 SQL 语句中的 ORDER BY

    用法:
    @code php
    ¥rows = ArrayHelper::sortByMultiCols(¥rows, array(
    parent => SORT_ASC,
    name => SORT_DESC,
    ));
    @endcode

    @param array ¥rowset 要排序的数组
    @param array ¥args 排序的键

    @return array 排序后的数组
    /
    static function sortByMultiCols(¥rowset¥args
    {
    ¥sortArray = array();
    ¥sortRule = ;
    foreach¥args as ¥sortField => ¥sortDir
    {
    foreach¥rowset as ¥offset => ¥row
    {
    ¥sortArray[¥sortField][¥offset] = ¥row[¥sortField];
    }
    ¥sortRule .= ¥sortArray[\ . ¥sortField . \], . ¥sortDir . , ;
    }
    ifempty¥sortArray) || empty¥sortRule)) {
    return ¥rowset;
    }
    eval(array_multisort( . ¥sortRule . ¥rowset););
    return ¥rowset;
    }


    }


    无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》
    分享到: