使用数组过滤器重写

时间:2018-08-10 21:01:26

标签: php array-filter

在某些情况下,如何使用foreach来写下面的array_filter

 foreach ($categories as $category) {
        if ($this->request->getParam('category_id')) {
            if ($category->getCategoryId() == $this->request->getParam('category_id')) {
                $selectedCategory = $category;
                break;
            }
        } else {
             No category id in request. Select the first one.
            if (array_key_exists(0, $categoryTree) &&
                $category->getCategoryId() == $categoryTree[0]['id']
            ) {
                $selectedCategory = $category;
                break;
            }
        }
    }

2 个答案:

答案 0 :(得分:0)

首先,使用array_filter在这种情况下无济于事,因为它减少了数组而不是选择元素。但是要显示其原理,您可以将代码重写为类似以下内容。

if($this->request->getParam('category_id')){
  $filteredCategories = array_filter($categories, function ($category) use ($this){
    return $category->getCategoryId() == $this->request->getParam('category_id');
  });
  if(count($filteredCategories)>0){
    return $filteredCategories[0];
  }
} else {
  [...]
}

答案 1 :(得分:0)

我认为您想要一个交集函数,而不是数组过滤器。

    function key_compare_func($key1, $key2) 
    { 
        if ($key1 == $key2->getCategoryId()) {
            return 1;
        } else {
            return 0;
        }
    }

    $selectedCategory = array_intersect_ukey(
        $this>request>getParam('category_id'),
        $categories,
        'key_compare_func'
    )

有关不同数组函数的更多信息,请参见the PHP manual