【问题标题】:Access array returned by a function in phpphp中函数返回的访问数组
【发布时间】:2010-11-30 08:53:51
【问题描述】:

我正在使用模板引擎将代码插入到我想要的位置。

我写了一个函数来测试一些很容易的东西:

myfunction() { return '($this->data["a"]["b"] ? true : false)'; }

问题是,$this->data 是私有的,我不能到处访问它,所以我必须使用 getData();这导致了我的问题。

$this->getData()['a']['b']

不起作用,并且首先分配值也不起作用,因为它将直接在 if() 块中使用。

有什么想法吗?

【问题讨论】:

  • 分配返回值确实有效,并且是唯一的方法。你能告诉我们你的非工作代码吗?
  • 它不起作用,因为代码将被插入到 if(/*code here*/) 中。所以我不能只分配之前的数据。
  • 你到底在建造什么? :) 用 eval 的东西?
  • 您要检查什么?您是否尝试查看数组元素是否存在并且具有非空值?您可以为此使用“空”功能。这个问题需要更清楚!
  • 您在myfunction() 中返回的字符串值是如何被进一步处理的?您的问题中缺少该部分。

标签: php arrays


【解决方案1】:

从 PHP 5.4 开始,完全可以做到这一点:

getSomeArray()[2]

参考:https://secure.php.net/manual/en/language.types.array.php#example-62

在 PHP 5.3 或更早版本中,您需要使用临时变量。

【讨论】:

  • 我有PHP 5.4.11-1~precise+1,但此功能不起作用!收到消息回复Parse error: syntax error, unexpected '['
  • +Eugene 你搞定了吗?也许其他人也遇到过同样的问题。
  • 直到 php 5.4 才支持从函数返回的数组表示法?!多么讨厌的错误。
  • 然后你尝试获取array_filter生成的数组的第一个元素并开始哭泣
【解决方案2】:

你不能使用这样的东西:

$this->getData()['a']['b']

也就是说,数组访问语法不能直接用于函数调用。

你必须使用一些临时变量,像这样:

$tmp = $this->getData();
$tmp['a']['b']    // use $tmp, now

在你的情况下,这可能意味着使用这样的东西:

function myfunction() {
  $tmp = $this->getData();
  return ($tmp['a']['b'] ? true : false);
}

你必须:

  • 首先,调用您的getData() 方法,并将其返回值存储在一个临时变量中
  • 然后,使用该临时变量进行测试

实际上,你没有太多选择……

【讨论】:

  • 好吧,正如我所说,我的问题是这段代码被直接插入到 if(/* code goes here */) 中,所以实际上不可能定义一个函数......
  • 能否不将方法调用的结果赋值给if语句之前的变量,而在if语句中使用该变量,而不是直接尝试从if语句中调用方法?跨度>
  • 很遗憾没有...这是一个模板引擎,我无法控制它。
【解决方案3】:

好吧......显然真的没有更好的方法,所以我将用一个不太漂亮的解决方案来回答自己:

我创建了函数:

arrayGet($array, $index) { return $array[$index]; }

并像这样使用它:

myfunction() { return '(arrayGet(arrayGet($this, "a"), "b") ? true : false)' }

这并不漂亮,但很有效。

【讨论】:

    【解决方案4】:

    $this->data总是可以访问,如果它受到保护的话。 $object->data 无法从任何地方访问,因此如果您在代码中返回 $this,并且它是这样评估的,那么应该没问题。

    顺便说一句,您的代码中有一个错误:引号需要转义。

    myfunction() { return '($this->data[\'a\'][\'b\'] ? true : false)'; }
    

    【讨论】:

    • 是的,对不起...我更正了我的帖子:$this->data 当然是私有的。还纠正了我在创建错误时的错字。
    【解决方案5】:

    可以从 PHP 5.4 版开始。

    如果您不想要一个临时变量,并且您的 PHP 版本低于 5.4,那么您仍然可以使用一些内置函数来获取第一个或最后一个元素:

    $x     = 'first?last';
    $first = array_shift(explode('?', $x));
    $last  = end(explode('?', $x));
    $last2 = array_pop(explode('?', $x));
    

    编辑: !!!请注意,在以后的版本(5.4+)中,PHP 会抛出一个通知,因为 end 只期望变量作为参数。

    【讨论】:

      猜你喜欢
      • 2011-02-21
      • 1970-01-01
      • 2014-09-25
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      相关资源
      最近更新 更多