PHP中array_filter使用问题及筛选后数组结构调整需求
关于PHP array_filter的两个问题解答
问题1:回调中赋值后数组为空的原因及解决
你的代码存在两个核心问题:
- 错用array_filter的功能:array_filter的设计目的是筛选数组元素,回调函数返回布尔值(true保留元素、false丢弃),用它来做数组赋值属于完全错误的用法。
- global变量使用错误:
$myNewArray是mainFunction内的局部变量,并非全局变量,回调里用global $myNewArray根本找不到这个变量,赋值自然不会生效。
如果需求是把$data的元素存入$myNewArray,直接用赋值或foreach即可,没必要绕弯:
$var = "test"; function mainFunction() { global $var; $myNewArray = array(); $data = array("a", "b", "c"); // 直接赋值 $myNewArray = $data; // 或者foreach遍历添加 // foreach($data as $value) { // $myNewArray[] = $value; // } print_r($myNewArray); } mainFunction();
如果是学习用途非要用回调类函数实现,可以用use引用局部变量(注意传引用&):
$var = "test"; function mainFunction() { global $var; $myNewArray = array(); $data = array("a", "b", "c"); array_filter($data, function ($value) use (&$myNewArray) { $myNewArray[] = $value; return true; // 返回布尔值满足array_filter的要求 }); print_r($myNewArray); } mainFunction();
问题2:筛选后仅保留content字段的实现
array_filter只会保留原数组中符合条件的元素,不会修改元素结构。要实现只保留content字段,需要结合元素转换操作,有两种常用方法:
方法1:先筛选再转换
先用array_filter筛选出目标元素,再用array_map提取content字段:
function mainFunction() { global $var; $data[] = array("id" => "1", "content" => "Hello"); $data[] = array("id" => "2", "content" => "World"); // 筛选content为"World"的元素 $filtered = array_filter($data, function ($value) { return $value['content'] === "World"; }); // 转换为仅含content的数组 $myNewArray = array_map(function ($item) { return array("content" => $item['content']); }, $filtered); print_r($myNewArray); } mainFunction();
方法2:用array_reduce一步完成
array_reduce可以同时完成筛选和转换,减少一次遍历:
function mainFunction() { global $var; $data[] = array("id" => "1", "content" => "Hello"); $data[] = array("id" => "2", "content" => "World"); $myNewArray = array_reduce($data, function ($carry, $item) { if ($item['content'] === "World") { $carry[] = array("content" => $item['content']); } return $carry; }, array()); print_r($myNewArray); } mainFunction();
两种方法运行后都会得到你想要的输出:
Array ( [0] => Array ( [content] => World ) )
内容的提问来源于stack exchange,提问作者Trombone0904
相关产品推荐
相关产品推荐

