Categories
arrays php

Access array returned by a function in php

88

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?

5

  • Assigning the return value definitely does work and is the only way. Can you show us your non-working code?

    Sep 22, 2009 at 10:57

  • Well it does not work because the code will be inserted in an if(/*code here*/). So I can’t just assign the data before.

    – enyo

    Sep 22, 2009 at 11:13

  • 1

    What on earth are you building anyway? 🙂 something with eval?

    Sep 22, 2009 at 12:14

  • What are you trying to check? Do you try to see if the array element exists and has a non-empty value? You can use the function ’empty’ for this. This question needs more clarity!

    Sep 22, 2009 at 13:18

  • How is (was) that string value that you return in myfunction() processed further? That part is missing in your question.

    – hakre

    Jul 13, 2013 at 9:46

137

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.

4

  • 4

    I’ve got PHP 5.4.11-1~precise+1 and this feature doesn’t work! Got message in response Parse error: syntax error, unexpected '['

    – Eugene

    Apr 28, 2013 at 0:16


  • 1

    +Eugene did you get it working? Maybe others experience the same problem.

    – enyo

    May 13, 2013 at 15:34

  • 2

    It took till php 5.4 to support array notation returned from functions?! What a nasty bug.

    Dec 10, 2015 at 16:03

  • And then you try to get the first element of an array generated by array_filter and start crying

    – Loupax

    Mar 29, 2016 at 10:34

19

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…

3

  • Well, as I said, my problem is that this code gets inserted, directly in if(/* code goes here */) so defining a function there is not really possible…

    – enyo

    Sep 22, 2009 at 11:00

  • Can you not assign the result of the method call to a variable before the if statement, and use that variable in the if statement, instead of directly trying to call the method from the if statement ?

    Sep 22, 2009 at 11:01

  • 1

    Unfortunately no… This is a templating engine, and I have no control over it.

    – enyo

    Sep 22, 2009 at 11:18

12

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.