我们假设我们有两个功能。首先返回一个包含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:不接受产生任何警告或通知的答案。以及使用@
来抑制错误
答案 0 :(得分:5)
你可以使用current()
,假设foo()
没有改变数组指针(例如使用next()
),再加上一个三元运算符:
return current(foo()) ?: null;
如果您的数组中的标量符号计算为false
,那么这显然会产生奇怪的结果,但如果所有元素都是对象,则可以正常工作。
或者,为了防止foo()
进行修改,您也可以使用reset()
:
return reset((foo())) ?: null;
警告强>
请注意上述代码中的额外括号,它们不是多余的,而是基于a peculiarity in the language;这种行为将来可能会改变,所以你不应该依赖它。引入临时变量会更安全。
答案 1 :(得分:1)
$return = ($arr = foo()) ? reset($arr) : null;
为什么你不能使用当前的
function foo()
{
$array = array(1,2,3);
next($array);
return $array;
}
echo current(foo()); // 2