2

this question is just for fun and maybe learning a PHP shorthand trick (if exists) Let's assume that I have this code:

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

By default, *prepare_items* function takes an array of items and return them with some modifications so if I want to call it on one item only I should push it into an array like above, but then I have to pull out the item from the array I created.

So is there a shorthand way to do this, like:

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

Also if you have a link for a set of tips and tricks for PHP that would be great.

ifaour
  • 38,035
  • 12
  • 72
  • 79
  • Is there any particular reason PHP *doesn't* support inline array index upon return value like this? I don't know anything about compiler design, but it seems that plenty of other languages I have used support this. – Brad Nov 26 '10 at 16:13
  • 1
    I suspect a combination of initial laziness, followed by syntax rules that had to remain silly or break too much existing code (because that's a syntax error, not a semantic issue). – Victor Nicollet Nov 26 '10 at 16:16

4 Answers4

5

You can use reset($array) to reset the internal array position and return the value of the first element.

Victor Nicollet
  • 24,361
  • 4
  • 58
  • 89
  • 1
    It's not very intuitive (if I would see that in the code, it would take me half a minute to understand what the hell it is for) but a valid answer. – Pekka Nov 26 '10 at 16:02
  • 1
    this actually would do the job for this particular case, I'm gonna leave it for a day and then accept your answer as this question is meant for fun and not actually a problem. – ifaour Nov 26 '10 at 16:04
  • 1
    I'm certainly not advocating its use in production code, but it's a nice curiosity ;-) – Victor Nicollet Nov 26 '10 at 16:04
  • Very interesting... Yes, I will never do this, but one of those dark corners of PHP I've never seen. Interesting... – Brad Nov 26 '10 at 16:12
  • Yeah, according to the comments section in the documentation this would give unexpected results on associative arrays:http://www.php.net/manual/en/function.reset.php#96090 But still it works for this case :-) – ifaour Nov 26 '10 at 16:25
2

In PHP 5.4 this becomes an easy one-liner

As of PHP 5.4 it is possible to array dereference the result of a function or method call directly. Before it was only possible using a temporary variable.

$firstElement = getArray()[0];

where

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

Taken from a slightly modified version of Example #7 from the PHP manual pages (Arrays).

flu
  • 14,307
  • 8
  • 74
  • 71
2

Nope, as far as I know, there is no way to do this in PHP.

What you could do is return an object of a class that has a method getLine(). With that, you could do

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

you could - I'm not saying it's necessarily always a good idea, but it's becoming more and more popular, probably influenced by jQuery's elegance - also store the results of get_item in the object, and have it return $this to allow for method chaining like so:

$item = $this->get_item($id)->prepare_items()->getLine(0);
Pekka
  • 442,112
  • 142
  • 972
  • 1,088
  • I hate that about PHP. It doesn't seem like a particularly difficult thing to support... – Mike Caron Nov 26 '10 at 15:59
  • ah thanks Pekka, that was fast! LOL OK that is not necessary, by the way I have updated the question (last line). – ifaour Nov 26 '10 at 16:00
  • hmm, nice addition..can you elaborate please..I'm using CI and the code is not actually like that, it's a model call:$this->Eb_model->get_item($id); which is returning $query->row_array(); – ifaour Nov 26 '10 at 16:13
  • @ifaour mmm, if this is following CI's coding standards, I wouldn't change it. For method chaining, every method would have to return its parent object (`return $this;`) – Pekka Nov 26 '10 at 16:16
0

For the first one, you can do this trick... for other indices, it gets uglier.

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

I was looking for a more elegant answer but here we are :)

Engin
  • 166
  • 1
  • 4