這篇文章主要介紹了PHP數組操作類,涉及php針對數組的刪除、轉換、分組、排序等相關操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
本文實例講述了PHP數組操作類。分享給大家供大家參考。具體如下:
- 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)
- {
- if (is_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)
- {
- if (isset($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;
- }
- /**
- * 將一個二維數組按照指定字段的值分組
- *
- * 用法:
- * @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;
- }
- /**
- * 將一個平面的二維數組按照指定的字段轉換為樹狀結構
- *
- *
- * 如果要獲得任意節點為根的子樹,可以使用 $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();
- 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
- *
- * @param array $array 要排序的數組
- * @param string $keyname 排序的鍵
- * @param int $dir 排序方向
- *
- * @return array 排序后的數組
- */
- static function sortByCol($array, $keyname, $dir = SORT_ASC)
- {
- return self::sortByMultiCols($array, array($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 . ', ';
- }
- if (empty($sortArray) || empty($sortRule)) {
- return $rowset;
- }
- eval('array_multisort(' . $sortRule . '$rowset);');
- return $rowset;
- }
- }
希望本文所述對大家的php程序設計有所幫助。
新聞熱點
疑難解答