1. 程式人生 > >常用php陣列操作

常用php陣列操作

/**
 * 陣列層級縮排轉換
 * @param array $array 源陣列
 * @param int   $pid
 * @param int   $level
 * @return array
 */
function Array2level($array, $pid = 0, $level = 1)
{
    static $list = [];
    foreach ($array as $v) {
        if ($v['pid'] == $pid) {
            $v['level'] = $level;
            $list[]     = $v;
            Array2level($array, $v['id'], $level + 1);
        }
    }
    return $list;
}
/**
 * 把返回的資料集轉換成Tree
 * @access public
 * @param array $list 要轉換的資料集
 * @param string $pid parent標記欄位
 * @param string $level level標記欄位
 * @return array
 */
function list_to_tree($list, $pk='id', $pid = 'pid', $child = 'son', $root = 0, $is_count = false) {
    // 建立Tree
    $tree = [];
    if(is_array($list)) {
        // 建立基於主鍵的陣列引用
        $refer = [];
        foreach ($list as $key => $data) {
            $refer[$data[$pk]] =& $list[$key];
        }

        foreach ($list as $key => $data) {
            // 判斷是否存在parent
            $parentId =  $data[$pid];
            if ($root == $parentId) {
                $tree[] =& $list[$key];
            }else{
                if (isset($refer[$parentId])) {
                    $parent =& $refer[$parentId];
                    $parent[$child][] =& $list[$key];
                    if($is_count==true) $parent['_count'] = count($parent[$child]);
                }
            }
        }
    }
    return $tree;
}
/**
 * 將資料格式化成樹形結構
 * @param array $items
 * @return array
 */
function genTree($items,$pk='id',$pid = 'pid', $child = '_child') {
    $tree = []; //格式化好的樹
    foreach ($items as $item)
        if (isset($items[$item[$pid]]))
            $items[$item[$pid]][$child][] = &$items[$item[$pk]];
        else
            $tree[] = &$items[$item[$pk]];
    return $tree;
}
/**
 * 多個數組的笛卡爾積
 *
 * @param unknown_type $data
 */
function combineDika() {
    $data = func_get_args();
    $data = current($data);
    $cnt = count($data);
    $result = array();
    $arr1 = array_shift($data);
    foreach($arr1 as $key=>$item)
    {
        $result[] = array($item);
    }

    foreach($data as $key=>$item)
    {
        $result = combineArray($result,$item);
    }
    return $result;
}
/**
 * 兩個陣列的笛卡爾積
 * @param  array $arr1 [description]
 * @param  array $arr2 [description]
 * @return [type] [description]
 * @date   2017-08-07
 * @author 趙俊峰 <[email protected]>
 */
function combineArray($arr1 =[],$arr2=[]) {
    $result = [];
    foreach ($arr1 as $item1)
    {
        foreach ($arr2 as $item2)
        {
            $temp = $item1;
            $temp[] = $item2;
            $result[] = $temp;
        }
    }
    return $result;
}
/**
 * 將二維陣列以元素的某個值作為鍵 並歸類陣列
 * array( array('name'=>'aa','type'=>'pay'), array('name'=>'cc','type'=>'pay') )
 * array('pay'=>array( array('name'=>'aa','type'=>'pay') , array('name'=>'cc','type'=>'pay') ))
 * @param $arr 陣列
 * @param $key 分組值的key
 * @return array
 */
function group_same_key($arr,$key){
    $new_arr = array();
    foreach($arr as $k=>$v ){
        $new_arr[$v[$key]][] = $v;
    }
    return $new_arr;
}
/**
 * @param $arr
 * @param $key_name
 * @return array
 * 將資料庫中查出的列表以指定的 id 作為陣列的鍵名
 */
function convert_arr_key($arr, $key_name='id')
{
    $arr2 = [];
    foreach($arr as $key => $val){
        $arr2[$val[$key_name]] = $val;
    }
    return $arr2;
}
/**
 * 陣列 轉 物件
 *
 * @param array $arr 陣列
 * @return object
 */
function array_to_object($arr) {
    if (gettype($arr) != 'array') {
        return;
    }
    foreach ($arr as $k => $v) {
        if (gettype($v) == 'array' || getType($v) == 'object') {
            $arr[$k] = (object)array_to_object($v);
        }
    }

    return (object)$arr;
}
/**
 * 物件 轉 陣列
 * @param object $obj 物件
 * @return array
 */
function object_to_array($obj) {
    $obj = (array)$obj;
    foreach ($obj as $k => $v) {
        if (gettype($v) == 'resource') {
            return;
        }
        if (gettype($v) == 'object' || gettype($v) == 'array') {
            $obj[$k] = (array)object_to_array($v);
        }
    }

    return $obj;
}
//將 xml資料轉換為陣列格式。
function xml_to_array($xml){
    $reg = "/<(\w+)[^>]*>([\\x00-\\xFF]*)<\\/\\1>/";
    if(preg_match_all($reg, $xml, $matches)){
        $count = count($matches[0]);
        for($i = 0; $i < $count; $i++){
            $subxml= $matches[2][$i];
            $key = $matches[1][$i];
            if(preg_match( $reg, $subxml )){
                $arr[$key] = xml_to_array( $subxml );
            }else{
                $arr[$key] = $subxml;
            }
        }
    }
    return $arr;
}

/**
 * array_delete  刪除陣列中的某個值
 * @param $array
 * @param $value
 * @return mixed
 */
function array_delete($array, $value)
{
    $key = array_search($value, $array);
    if ($key !== false)
        array_splice($array, $key, 1);
    return $array;
}
// 分析列舉型別配置值 格式 a:名稱1,b:名稱2
function parse_config_attr($value, $type = null) {
    switch ($type) {
        default: //解析"1:1\r\n2:3"格式字串為陣列
            $array = preg_split('/[,;\r\n]+/', trim($value, ",;\r\n"));
            if (strpos($value,':')) {
                $value  = array();
                foreach ($array as $val) {
                    list($k, $v) = explode(':', $val);
                    $value[$k]   = $v;
                }
            } else {
                $value = $array;
            }
            break;
    }
    return $value;
}
//array_column()函式相容低版本PHP
if (!function_exists('array_column')) {
    function array_column($input, $columnKey, $indexKey = null) {
        $columnKeyIsNumber = (is_numeric($columnKey)) ? true : false;
        $indexKeyIsNull = (is_null($indexKey)) ? true : false;
        $indexKeyIsNumber = (is_numeric($indexKey)) ? true : false;
        $result = array();
        foreach ((array) $input as $key => $row) {
            if ($columnKeyIsNumber) {
                $tmp = array_slice($row, $columnKey, 1);
                $tmp = (is_array($tmp) && !empty($tmp)) ? current($tmp) : null;
            } else {
                $tmp = isset($row[$columnKey]) ? $row[$columnKey] : null;
            }
            if (!$indexKeyIsNull) {
                if ($indexKeyIsNumber) {
                    $key = array_slice($row, $indexKey, 1);
                    $key = (is_array($key) && !empty($key)) ? current($key) : null;
                    $key = is_null($key) ? 0 : $key;
                } else {
                    $key = isset($row[$indexKey]) ? $row[$indexKey] : 0;
                }
            }
            $result[$key] = $tmp;
        }
        return $result;
    }
}