【问题标题】:How to return an array and get the first element of it in one line in PHP?如何在 PHP 的一行中返回一个数组并获取它的第一个元素?
【发布时间】:2011-05-16 06:19:11
【问题描述】:

这个问题只是为了好玩,也许是学习一个 PHP 速记技巧(如果存在) 假设我有这个代码:

$item = $this->get_item($id);
$item = $this->prepare_items(array($item));
$item = $item[0];

默认情况下,*prepare_items* 函数接受一个项目数组并返回它们并进行一些修改,所以如果我只想在一个项目上调用它,我应该将它推入一个像上面一样的数组中,但是我必须拉出我创建的数组中的项目。

那么有没有一种速记方法可以做到这一点,例如:

$item = $this->_prepare_items_output(array($item))[0];
// OR
$item = ($item = $this->_prepare_items_output(array($item)))[0];

另外,如果您有一组 PHP 提示和技巧的链接,那就太好了。

【问题讨论】:

  • PHP 在返回值时支持内联数组索引有什么特别的原因吗?我对编译器设计一无所知,但我用过的许多其他语言似乎都支持这一点。
  • 我怀疑是最初的懒惰,随后是必须保持愚蠢或破坏太多现有代码的语法规则(因为这是语法错误,而不是语义问题)。

标签: php


【解决方案1】:

您可以使用reset($array) 重置内部数组位置并返回第一个元素的值

【讨论】:

  • 这不是很直观(如果我能在代码中看到它,我需要半分钟才能理解它到底是干什么用的)但是一个有效的答案。
  • 这实际上可以解决这个特殊情况,我将把它搁置一天,然后接受你的回答,因为这个问题是为了好玩,而不是真正的问题。
  • 我当然不提倡在生产代码中使用它,但这是一个很好的好奇心 ;-)
  • 非常有趣...是的,我永远不会这样做,但我从未见过 PHP 的那些黑暗角落之一。有趣...
  • 是的,根据文档中的 cmets 部分,这会在关联数组上产生意想不到的结果:php.net/manual/en/function.reset.php#96090 但它仍然适用于这种情况 :-)
【解决方案2】:

不,据我所知,PHP 没有办法做到这一点。

可以做的是返回一个具有getLine() 方法的类的对象。有了它,你可以做到

$item = $this->prepare_items(array($item))->getLine(0);

你可以 - 我并不是说它一定总是一个好主意,但它变得越来越流行,可能受到 jQuery 优雅的影响 - 还将get_item 的结果存储在对象中,并让它返回@987654324 @ 允许这样的方法链接:

$item = $this->get_item($id)->prepare_items()->getLine(0);

【讨论】:

  • 我讨厌 PHP。支持起来似乎不是什么特别困难的事情……
  • 啊,谢谢Pekka,速度很快!哈哈,没必要,顺便说一句,我已经更新了问题(最后一行)。
  • 嗯,不错的补充..请您详细说明..我使用的是 CI,代码实际上不是那样的,它是一个模型调用:$this->Eb_model->get_item($id );返回 $query->row_array();
  • @ifaour mmm,如果这符合 CI 的编码标准,我不会更改它。对于方法链接,每个方法都必须返回其父对象 (return $this;)
【解决方案3】:

在 PHP 5.4 中,这变成了一种简单的单行方式

从 PHP 5.4 开始,可以取消对数组结果的引用 直接调用函数或方法。以前只能使用 临时变量。

$firstElement = getArray()[0];

在哪里

function getArray() {
    return array(1, 2, 3);
}

取自 the PHP manual pages (Arrays) 中示例 #7 的略微修改版本。

【讨论】:

    【解决方案4】:

    对于第一个,你可以做这个技巧......对于其他索引,它变得更丑。

    list($algo) = explode(':', $password);
    

    我一直在寻找更优雅的答案,但我们来了:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-01
      • 2016-10-31
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 2019-11-19
      • 1970-01-01
      相关资源
      最近更新 更多