PHP中的函数返回的访问数组


88

我正在使用一个模板引擎,该引擎将代码插入我想要的站点中。

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

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

问题是,$ this-> data是私有的,我无法在任何地方访问它,因此我必须使用getData();。这导致我的问题。

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

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

有任何想法吗?


分配返回值肯定是可行的,并且是唯一的方法。您能告诉我们您的无效代码吗?
Anti Veeranna

好吧,这是行不通的,因为代码将插入到if(/ *此处代码* /)中。所以我不能只分配数据。
enyo

1
您到底在建造什么?:)有评估?
Anti Veeranna

您要检查什么?您是否尝试查看数组元素是否存在并且具有非空值?您可以为此使用“空”功能。这个问题需要更清楚!
txwikinger 2009年

您返回的字符串值如何被(进一步)myfunction()处理?您的问题中缺少该部分。
hakre

Answers:


134

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

getSomeArray()[2]

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

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


4
我知道了PHP 5.4.11-1~precise+1,此功能不起作用!得到消息回应Parse error: syntax error, unexpected '['
尤金

1
+尤金(Eugene)您能正常使用吗?也许其他人也会遇到同样的问题。
enyo

2
直到php 5.4才支持从函数返回的数组符号?真是个讨厌的错误。
罗勒·穆萨

然后,您尝试获取由array_filter生成的数组的第一个元素并开始哭泣
Loupax

17

您不能使用这样的东西:

$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(/ *代码在这里* /)中插入了此代码,因此定义函数实际上是不可能的……
enyo

您是否不能将方法调用的结果分配给if语句之前的变量,并在if语句中使用该变量,而不是直接尝试从if语句中调用方法?
Pascal MARTIN

1
不幸的是,不...这是一个模板引擎,我无法控制它。
enyo

12

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

我创建了函数:

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

并像这样使用它:

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

这不是很漂亮,但是有效。


1

$this->data始终可以访问,如果保护。无法从任何地方访问,因此如果您要返回$object->data$this代码并对其进行评估,就可以了。

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

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

是的,对不起...我更正了我的帖子:$ this-> data当然是私有的。创建错误时还纠正了我的错字。
enyo

1

从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仅将变量用作参数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.