假设我们有 2 个函数。第一个返回一个包含0..N
元素的数组,第二个只需要返回第一个元素,如果没有元素,则NULL
。
假设我们有这样的代码:
/**
* return stdClass[]
*/
function foo()
{
return ...;
}
/**
* return stdClass|null
*/
function bar()
{
$arr = foo();
if ($arr) {
return $arr[0];
}
}
如您所见,bar()
的实现很无聊。
如果我使用 .NET,那么我会使用arr.FirstOrDefault()
方法,它将非常适合任务。
在 php 中这样做最优雅的方式是什么?
PS:不接受产生任何类型的警告或通知的答案。以及使用@
来抑制错误的那些
你可以使用current()
,假设foo()
不改变数组指针(例如使用next()
),再加上一个三元运算符:
return current(foo()) ?: null;
如果你的数组中有计算结果为 false
的标量,这显然会产生奇怪的结果,但如果所有元素都是对象,这将正常工作。
或者,为了防止foo()
所做的修改,您也可以使用reset()
:
return reset((foo())) ?: null;
警告
请注意上面代码中多余的括号,它们不是多余的,并且基于语言的特殊性;这种行为将来可能会改变,所以你不应该依赖它。引入临时变量会更安全。
$return = ($arr = foo()) ? reset($arr) : null;
为什么你不能使用电流
function foo()
{
$array = array(1,2,3);
next($array);
return $array;
}
echo current(foo()); // 2