数组操作类
<span class</span><span ArrayHelper{ </span><span /*</span><span * * 从数组中删除空白的元素(包括只有空白字符的元素) * * 用法: * @code php * $arr = array('', 'test', ' '); * ArrayHelper::removeEmpty($arr); * * dump($arr); * // 输出结果中将只有 'test' * @endcode * * @param array $arr 要处理的数组 * @param boolean $trim 是否对数组元素调用 trim 函数 </span><span */</span> <span static</span> <span function</span> removeEmpty(& <span $arr</span>, <span $trim</span> = <span TRUE</span><span ) { </span><span foreach</span> (<span $arr</span> <span as</span> <span $key</span> => <span $value</span><span ) { </span><span if</span> (<span is_array</span>(<span $value</span><span )) { self</span>::removeEmpty(<span $arr</span>[<span $key</span><span ]); } </span><span else</span><span { </span><span $value</span> = <span trim</span>(<span $value</span><span ); </span><span if</span> (<span $value</span> == ''<span ) { </span><span unset</span>(<span $arr</span>[<span $key</span><span ]); } </span><span elseif</span> (<span $trim</span><span ) { </span><span $arr</span>[<span $key</span>] = <span $value</span><span ; } } } } </span><span /*</span><span * * 从一个二维数组中返回指定键的所有值 * * 用法: * @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 包含指定键所有值的数组 </span><span */</span> <span static</span> <span function</span> getCols(<span $arr</span>, <span $col</span><span ) { </span><span $ret</span> = <span array</span><span (); </span><span foreach</span> (<span $arr</span> <span as</span> <span $row</span><span ) { </span><span if</span> (<span isset</span>(<span $row</span>[<span $col</span><span ])) { </span><span $ret</span>[] = <span $row</span>[<span $col</span><span ]; } } </span><span return</span> <span $ret</span><span ; } </span><span /*</span><span * * 将一个二维数组转换为 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 样式数组 </span><span */</span> <span static</span> <span function</span> toHashmap(<span $arr</span>, <span $keyField</span>, <span $valueField</span> = <span NULL</span><span ) { </span><span $ret</span> = <span array</span><span (); </span><span if</span> (<span $valueField</span><span ) { </span><span foreach</span> (<span $arr</span> <span as</span> <span $row</span><span ) { </span><span $ret</span>[<span $row</span>[<span $keyField</span>]] = <span $row</span>[<span $valueField</span><span ]; } } </span><span else</span><span { </span><span foreach</span> (<span $arr</span> <span as</span> <span $row</span><span ) { </span><span $ret</span>[<span $row</span>[<span $keyField</span>]] = <span $row</span><span ; } } </span><span return</span> <span $ret</span><span ; } </span><span /*</span><span * * 将一个二维数组按照指定字段的值分组 * * 用法: * @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 分组后的结果 </span><span */</span> <span static</span> <span function</span> groupBy(<span $arr</span>, <span $keyField</span><span ) { </span><span $ret</span> = <span array</span><span (); </span><span foreach</span> (<span $arr</span> <span as</span> <span $row</span><span ) { </span><span $key</span> = <span $row</span>[<span $keyField</span><span ]; </span><span $ret</span>[<span $key</span>][] = <span $row</span><span ; } </span><span return</span> <span $ret</span><span ; } </span><span /*</span><span * * 将一个平面的二维数组按照指定的字段转换为树状结构 * * 用法: * @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 树形结构的数组 </span><span */</span> <span static</span> <span function</span> toTree(<span $arr</span>, <span $keyNodeId</span>, <span $keyParentId</span> = 'parent_id', <span $keyChildrens</span> = 'childrens', & <span $refs</span> = <span NULL</span><span ) { </span><span $refs</span> = <span array</span><span (); </span><span foreach</span> (<span $arr</span> <span as</span> <span $offset</span> => <span $row</span><span ) { </span><span $arr</span>[<span $offset</span>][<span $keyChildrens</span>] = <span array</span><span (); </span><span $refs</span>[<span $row</span>[<span $keyNodeId</span>]] =& <span $arr</span>[<span $offset</span><span ]; } </span><span $tree</span> = <span array</span><span (); </span><span foreach</span> (<span $arr</span> <span as</span> <span $offset</span> => <span $row</span><span ) { </span><span $parentId</span> = <span $row</span>[<span $keyParentId</span><span ]; </span><span if</span> (<span $parentId</span><span ) { </span><span if</span> (!<span isset</span>(<span $refs</span>[<span $parentId</span><span ])) { </span><span $tree</span>[] =& <span $arr</span>[<span $offset</span><span ]; </span><span continue</span><span ; } </span><span $parent</span> =& <span $refs</span>[<span $parentId</span><span ]; </span><span $parent</span>[<span $keyChildrens</span>][] =& <span $arr</span>[<span $offset</span><span ]; } </span><span else</span><span { </span><span $tree</span>[] =& <span $arr</span>[<span $offset</span><span ]; } } </span><span return</span> <span $tree</span><span ; } </span><span /*</span><span * * 将树形数组展开为平面的数组 * * 这个方法是 tree() 方法的逆向操作。 * * @param array $tree 树形数组 * @param string $keyChildrens 包含子节点的键名 * * @return array 展开后的数组 </span><span */</span> <span static</span> <span function</span> treeToArray(<span $tree</span>, <span $keyChildrens</span> = 'childrens'<span ) { </span><span $ret</span> = <span array</span><span (); </span><span if</span> (<span isset</span>(<span $tree</span>[<span $keyChildrens</span>]) && <span is_array</span>(<span $tree</span>[<span $keyChildrens</span><span ])) { </span><span foreach</span> (<span $tree</span>[<span $keyChildrens</span>] <span as</span> <span $child</span><span ) { </span><span $ret</span> = <span array_merge</span>(<span $ret</span>, self::treeToArray(<span $child</span>, <span $keyChildrens</span><span )); } </span><span unset</span>(<span $node</span>[<span $keyChildrens</span><span ]); </span><span $ret</span>[] = <span $tree</span><span ; } </span><span else</span><span { </span><span $ret</span>[] = <span $tree</span><span ; } </span><span return</span> <span $ret</span><span ; } </span><span /*</span><span * * 根据指定的键对数组排序 * * 用法: * @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 排序后的数组 </span><span */</span> <span static</span> <span function</span> sortByCol(<span $array</span>, <span $keyname</span>, <span $dir</span> =<span SORT_ASC) { </span><span return</span> self::sortByMultiCols(<span $array</span>, <span array</span>(<span $keyname</span> => <span $dir</span><span )); } </span><span /*</span><span * * 将一个二维数组按照多个列进行排序,类似 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 排序后的数组 </span><span */</span> <span static</span> <span function</span> sortByMultiCols(<span $rowset</span>, <span $args</span><span ) { </span><span $sortArray</span> = <span array</span><span (); </span><span $sortRule</span> = ''<span ; </span><span foreach</span> (<span $args</span> <span as</span> <span $sortField</span> => <span $sortDir</span><span ) { </span><span foreach</span> (<span $rowset</span> <span as</span> <span $offset</span> => <span $row</span><span ) { </span><span $sortArray</span>[<span $sortField</span>][<span $offset</span>] = <span $row</span>[<span $sortField</span><span ]; } </span><span $sortRule</span> .= '$sortArray[\'' . <span $sortField</span> . '\'], ' . <span $sortDir</span> . ', '<span ; } </span><span if</span> (<span empty</span>(<span $sortArray</span>) || <span empty</span>(<span $sortRule</span><span )) { </span><span return</span> <span $rowset</span><span ; } </span><span eval</span>('array_multisort(' . <span $sortRule</span> . '$rowset);'<span ); </span><span return</span> <span $rowset</span><span ; } }</span>

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

使用foreach循環移除PHP數組中重複元素的方法如下:遍歷數組,若元素已存在且當前位置不是第一個出現的位置,則刪除它。舉例而言,若資料庫查詢結果有重複記錄,可使用此方法移除,得到不含重複記錄的結果。

PHP中深度複製數組的方法包括:使用json_decode和json_encode進行JSON編碼和解碼。使用array_map和clone進行深度複製鍵和值的副本。使用serialize和unserialize進行序列化和反序列化。

PHP數組鍵值翻轉方法效能比較顯示:array_flip()函數在大型數組(超過100萬個元素)下比for迴圈效能更優,耗時更短。手動翻轉鍵值的for迴圈方法耗時相對較長。

多維數組排序可分為單列排序和嵌套排序。單列排序可使用array_multisort()函數依列排序;巢狀排序需要遞歸函數遍歷陣列並排序。實戰案例包括按產品名稱排序和按銷售量和價格複合排序。

PHP的array_group_by函數可依鍵或閉包函數將陣列中的元素分組,傳回關聯數組,其中鍵為組名,值是屬於該組的元素數組。

在PHP中執行陣列深度複製的最佳實踐是:使用json_decode(json_encode($arr))將陣列轉換為JSON字串,然後再轉換回陣列。使用unserialize(serialize($arr))將陣列序列化為字串,然後將其反序列化為新陣列。使用RecursiveIteratorIterator迭代器對多維數組進行遞歸遍歷。

目錄Astar Dapp 質押原理質押收益 拆解潛在空投項目:AlgemNeurolancheHealthreeAstar Degens DAOVeryLongSwap 質押策略 & 操作“AstarDapp質押”今年初已升級至V3版本,對質押收益規則做了不少調整。目前首個質押週期已結束,第二質押週期的「投票」子週期剛開始。若要獲得「額外獎勵」收益,需掌握此關鍵階段(預計持續至6月26日,現餘不到5天)。我將細緻拆解Astar質押收益,

PHP陣列去重演算法的複雜度:array_unique():O(n)array_flip()+array_keys():O(n)foreach迴圈:O(n^2)
