首页 > 解决方案 > PHP array_filter 奇怪的行为

问题描述

我正在使用带有多个参数的array_filter,但它没有正确执行过滤器。在这里它应该返回一个只有“arts,crafts,designs”作为元素的数组,它返回一个空数组。它唯一适用的 $askedcat 参数是“arts”。我无法找出问题所在。

我试过不使用 array_filter 而是只循环数组,我遇到了同样的问题。


<?php

    class CategoryFilter {
        public $categoryAskedFor;

        function __construct($askedCat) {
                $this->categoryAskedFor = $askedCat;
        }

        function categoryCallback($projectCategoryString) {
            $project_category_array = explode(",", $projectCategoryString);
            if(in_array($this->categoryAskedFor, $project_category_array)) return true;
            return false;
        }
    }

    $verifiedProjects = ["arts", "arts,crafts,designs", "film", "film,theater"];

    $askedCat = "crafts";

    $newArr = array_filter($verifiedProjects, array(new CategoryFilter($askedCat), "categoryCallback"));

    for ($i = 0; $i < count($newArr); $i++) {
        echo $newArr[$i] . "<br>";
    }

我希望这里的输出是arts,crafts,design<br>,但这只是<br>意味着数组是空的。

标签: phparrays

解决方案


有很多方法可以实现这一点,但让我在这里向您展示两种方法

方式#1

如果您使用for循环来检索数组值,则需要有数字键,并且根据您的代码,您需要array_values函数来管理它

<?php

    class CategoryFilter {
        public $categoryAskedFor;

        function __construct($askedCat) {
                $this->categoryAskedFor = $askedCat;
        }

        function categoryCallback($projectCategoryString) {
            $project_category_array = explode(",", $projectCategoryString);
            if(in_array($this->categoryAskedFor, $project_category_array)) return true;
            return false;
        }
    }

    $verifiedProjects = ["arts", "arts,crafts,designs", "film", "film,theater"];

    $askedCat = "crafts";

    $newArr = array_filter($verifiedProjects, array(new CategoryFilter($askedCat), "categoryCallback"));

    $newArr = array_values($newArr);
    for ($i = 0; $i < count($newArr); $i++) {
        echo $newArr[$i] . "<br>";
    }

方式#2

如果您不想在array_values这里使用,那么您需要管理foreach循环而不是for循环

<?php

    class CategoryFilter {
        public $categoryAskedFor;

        function __construct($askedCat) {
                $this->categoryAskedFor = $askedCat;
        }

        function categoryCallback($projectCategoryString) {
            $project_category_array = explode(",", $projectCategoryString);
            if(in_array($this->categoryAskedFor, $project_category_array)) return true;
            return false;
        }
    }

    $verifiedProjects = ["arts", "arts,crafts,designs", "film", "film,theater"];

    $askedCat = "crafts";

    $newArr = array_filter($verifiedProjects, array(new CategoryFilter($askedCat), "categoryCallback"));

    foreach ($newArr as $value) {
        echo $value . "<br>";
    }

推荐阅读