第 03 章:数组与字符串处理
第 03 章:数组与字符串处理本章要点:数组和字符串是 PHP 最常用的数据类型。掌握它们的高效处理方法,是成为 PHP 高手的必经之路。3.1 索引数组与关联数组3.1.1 数组创建与初始化?php// 索引数组(数字下标)$fruits=['apple','banana','orange'];$numbers=array(1,2,3,4,5);// 旧语法,仍支持$mixed=[1,'two',3.0,true,null];// 关联数组(键值对)$user=['id'=1,'name'='John Doe','email'='john@example.com','age'=25];// 嵌套数组$company=['name'='Tech Corp','departments'=['IT'=[['name'='Alice','role'='Developer'],['name'='Bob','role'='Designer']],'HR'=[['name'='Charlie','role'='Manager']]],'founded'=2020];// 数组解构(PHP 7.1+)[$first,$second,$third]=$fruits;echo$first;// apple['name'=$name,'email'=$email]=$user;echo$name;// John Doe// 带默认值的解构[$a,$b,$c='default']=[1,2];echo$c;// default// 跳过某些元素[,$skip,$take]=$fruits;echo$skip;// banana3.1.2 数组访问与修改?php$colors=['red','green','blue'];// 访问元素echo$colors[0];// redecho$colors[-1];// PHP 7.1+: blue(最后一个)// 修改元素$colors[1]='yellow';$colors[]='purple';// 追加// 关联数组$user['city']='Beijing';// 添加$user['age']=26;// 修改// 多维数组访问echo$company['departments']['IT'][0]['name'];// Alice// 安全访问(避免警告)$value=$array['key']??'default';$value=isset($array['key'])?$array['key']:'default';// 批量修改array_walk($colors,fn($color)=$color=strtoupper($color));3.1.3 数组常用操作?php$items=[1,2,3,4,5];// 获取长度$count=count($items);// 5$count=sizeof($items);// 5(count 的别名)// 首尾操作$first=reset($items);// 1(第一个值)$last=end($items);// 5(最后一个值)$firstKey=array_key_first($items);// 0$lastKey=array_key_last($items);// 4// 弹出元素$last=array_pop($items);// 5(删除并返回最后一个)$first=array_shift($items);// 1(删除并返回第一个)// 添加元素array_push($items,6,7);// 末尾添加多个array_unshift($items,0,-1);// 开头添加多个// 切片$slice=array_slice($items,2,3);// 从索引 2 开始取 3 个$slice=array_slice($items,-3);// 最后 3 个$slice=array_slice($items,1,2,true);// 保持键名// 替换array_splice($items,2,1,['a','b']);// 从索引 2 删除 1 个,插入 2 个// 合并$merged=array_merge($items,$colors);$combined=$items+$colors;// 只添加不存在的键// 去重$unique=array_unique($items);// 翻转$reversed=array_reverse($items);$flipped=array_flip($items);// 键值互换3.1.4 实战:数组操作类?php/** * 数组工具类 * 封装常用数组操作 */classArrayUtil{/** * 按指定键分组 */publicstaticfunctiongroupBy(array$items,string$key):array{$result=[];foreach($itemsas$item){$groupKey=is_array($item)?$item[$key]:$item-$key;$result[$groupKey][]=$item;}return$result;}/** * 提取指定列 */publicstaticfunctionpluck(array$items,string$key):array{returnarray_column($items,$key);}/** * 深度合并数组 */publicstaticfunctionmergeDeep(array...$arrays):array{$result=array_shift($arrays);foreach($arraysas$array){foreach($arrayas$key=$value){if(is_array($value)isset($result[$key])is_array($result[$key])){$result[$key]=self::mergeDeep($result[$key],$value);}else{$result[$key]=$value;}}}return$result;}/** * 树形结构转列表 */publicstaticfunctionflattenTree(array$tree,string$childrenKey='children'):array{$result=[];foreach($treeas$item){$children=$item[$childrenKey]??[];unset($item[$childrenKey]);$result[]=$item;if($children){$result=array_merge($result,self::flattenTree($children,$childrenKey));}}return$result;}/** * 列表转树形结构 */publicstaticfunctionlistToTree(array$items,string$idKey='id',string$parentKey='parent_id',string$childrenKey='children'):array{$grouped=[];$tree=[];foreach($itemsas$item){$grouped[$item[$idKey]]=$item;}foreach(