简体   繁体   中英

Access array returned by a function in php

I'm using a template engine that inserts code in my site where I want it.

I wrote a function to test for something which is quite easy:

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

The problem is, $this->data is private, and I can't access it everywhere, so I have to use getData(); which causes my problem.

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

does not work, and assigning the value first doesn't either because it will be used directly in an if() block.

Any ideas?

Since PHP 5.4 it's possible to do exactly that:

getSomeArray()[2]

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

On PHP 5.3 or earlier, you'll need to use a temporary variable.

You cannot use something like this :

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

ie, array-access syntax is not possible directly on a function-call.

Youy have to use some temporary variable , like this :

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

In your case, this probably means using something like this :

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

You have to :

  • first, call your getData() method, and store its return value in a temporary varibale
  • then, use that temporary variable for your test

You don't have much choice about that, actually...

Ok... apparently there really isn't a better way, so I'm going to answer myself with a not so beautiful solution:

I created the function:

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

And used it like this:

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

This is not pretty but works.

->data is always accessible, if it is protected. ->data如果受保护,则始终可以访问。 ->data is not accessible from everywhere, so if you're returning $this in your code, and it is evaluated as such, it should be ok. ->data不能从任何地方访问,因此,如果您在代码中返回$this ,并且对其进行了评估,就可以了。

Btw, there is a bug in your code: The quotes need to be escaped.

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

It is possible from PHP version 5.4.

If you don't want a temporary variable for that and your PHP version is less, than 5.4 , than you still can use a few built in functions to get the first or the last element:

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

Edit: !!! Please note, that in later versions( 5.4+ ) PHP will throw a notice, because end only expects variables as parameter.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM