Как переписать данный код под PHP?
Имеется такой java код, как он будет выглядеть на PHP?
this.lines.stream().filter(line -> line.getIndex() == index).findFirst().orElse(null);
Ответы (1 шт):
Следует учитывать, что в PHP нет функционального стиля работы с коллекциями как это сделано в C# (Linq) или Java (StreamAPI). Поэтому аналогичные конструкции собирать придется из того, что есть в наличии и в случае их отсутствия, то писать обычные циклы и свои функции.
В данном случае для имитации filter можно использовать фильтрацию по массиву array_filter и анонимную функцию с замыканием, а для findFirst().orElse(null) получение первого элемента массива и тернарный оператор в случае если он вернется как false.
$arr = [
(object) ["index" => 1],
(object) ["index" => 2],
(object) ["index" => 3]
];
function create_filter($index) {
return function($v) use ($index) {
return $v->index == $index;
};
}
var_dump(reset(array_filter($arr, create_filter(3))) ?: null);
var_dump(reset(array_filter($arr, create_filter(1))) ?: null);
var_dump(reset(array_filter($arr, create_filter(4))) ?: null);
P.S. Он может ругаться PHP Notice: Only variables should be passed by reference, поскольку reset меняет массив. Чтобы избежать ошибки, придется делать в две строки.
$result = array_filter($arr, create_filter(3));
var_dump(reset($result) ?: null);
P.P.S. В любом случае пытаться писать так же плохая идея, поскольку аналога нету или надо искать специальную библиотеку, которая будет учитывать все особенности таких конструкций изначально.
UPD: вообще это обычный поиск первого элемента, совпавшего по условию.
$arr = [
(object) ["index" => 1],
(object) ["index" => 2],
(object) ["index" => 3]
];
function find($index, $arr) {
foreach($arr as $line) {
if ($line->index == $index)
return $line;
}
return null;
}
var_dump(find(2,$arr));