使用数组过滤器重写

How would I write the following foreach with some conditions using 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;
            }
        }
    }

First off, using array_filter isn't helpful in this case as it reduces an array instead of selecting an element. But to show its principles, you could rewrite the code to something like this.

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 {
  [...]
}

I think you want an intersection function and not an array filter.

    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'
    )

For more information on the different array functions you can look at the PHP manual