Reputation: 1009
I am trying to do something like this:
<?php
class item {
public $available;
public $name;
public function isAvailable() {
return $this->available;
}
}
$items = array(new item(), new item(), new item());
function getAvailableItems() {
return array_filter($GLOBALS['items'], $this.isAvailable);
}
$items[0]->available = false;
$items[0]->name = "x";
$items[1]->available = true;
$items[1]->name = "y";
$items[2]->available = true;
$items[2]->name = "z";
print("First available item " . reset(getAvailableItems())->name);
?>
But I am not sure of the correct syntax on line 15. I am using PHP 5.5.8.
I have been advised to do this:
return array_filter($GLOBALS['items'], array($this, 'isAvailable'));
But this doesn't work either:
<b>Warning</b>: array_filter() expects parameter 2 to be a valid callback, first array member is not a valid class name or object on line <b>15</b><br />
<br />
<b>Warning</b>: reset() expects parameter 1 to be array, null given on line <b>27</b><br />
First available item
class item {
public static $available;
public $name;
public static function isAvailable() {
return self::$available;
}
}
$items = array(new item(), new item(), new item());
function getAvailableItems() {
return array_filter($GLOBALS['items'], item::isAvailable());
}
$items[0]->available = false;
$items[0]->name = "x";
$items[1]->available = true;
$items[1]->name = "y";
$items[2]->available = true;
$items[2]->name = "z";
print("First available item " . reset(getAvailableItems())->name);
Also gives same warnings.
The best thing I've been able to do so far is this:
//<?php
class item {
public $available;
public $name;
}
$items = array(new item(), new item(), new item());
function getAvailableItems() {
return array_filter($GLOBALS['items'], function($item) {
return $item->available;
});
}
$items[0]->available = false;
$items[0]->name = "x";
$items[1]->available = true;
$items[1]->name = "y";
$items[2]->available = true;
$items[2]->name = "z";
print("First available item " . reset(getAvailableItems())->name);
//?>
As an anonymous function it works, but is there no way to pass a class function?
Upvotes: 0
Views: 99
Reputation: 4309
If you see the array_filter in callback php passes each value of the array in the callback function; so one of the possible solution is as follow:-
<?php
class item {
public $available;
public $name;
public function isAvailable() {
return $this->available;
}
}
$items = array(new item(), new item(), new item());
function getAvailableItems() {
return array_filter($GLOBALS['items'], 'filterItems');
}
function filterItems(item $item) {
return $item->available;
}
$items[0]->available = false;
$items[0]->name = "x";
$items[1]->available = true;
$items[1]->name = "y";
$items[2]->available = true;
$items[2]->name = "z";
print("First available item " . reset(getAvailableItems())->name); // First available item y
Upvotes: 1