17

I'm fetching something from database:

$foo = $this->fooRepository->all()->lists('name', 'id');

I get:

Collection {#506 ▼
  #items: array:9 [▼
    "9c436867-afe9-4234-a849-253aea4f602c" => "aaa"
    "d250102b-1370-40d0-99c5-7e5bfd0a15e4" => "sss"
    "7342f212-083b-458d-8af8-24986bbb627d" => "ddd"
    "029c53ce-dc16-49fd-8d83-9d8270d9ff37" => "fff"
    "3add6a37-72e2-4054-853e-9ed8addbf3ea" => "ggg"
    "28f5a9ac-014e-4f22-bda8-e2d5b1f48273" => "hhh"
    "94fccb2c-d732-4369-9bf7-78925797e578" => "jjj"
    "5b494994-93f0-406e-b420-aceb7b6111d7" => "kkk"
    "22a7824a-c6eb-45e7-b9c5-e40c134e3ac8" => "lll"
  ]
}

Perfect. This collection is later passed into Form::select to populate select / option dropdown.

I would like to prepend this collection with another key-value pair where key will be empty string and value will contain text like "Choose something".

I can append:

$foo[''] = 'Choose something…';

so I get

Collection {#506 ▼
  #items: array:10 [▼
    "9c436867-afe9-4234-a849-253aea4f602c" => "aaa"
    "d250102b-1370-40d0-99c5-7e5bfd0a15e4" => "sss"
    "7342f212-083b-458d-8af8-24986bbb627d" => "ddd"
    "029c53ce-dc16-49fd-8d83-9d8270d9ff37" => "fff"
    "3add6a37-72e2-4054-853e-9ed8addbf3ea" => "ggg"
    "28f5a9ac-014e-4f22-bda8-e2d5b1f48273" => "hhh"
    "94fccb2c-d732-4369-9bf7-78925797e578" => "jjj"
    "5b494994-93f0-406e-b420-aceb7b6111d7" => "kkk"
    "22a7824a-c6eb-45e7-b9c5-e40c134e3ac8" => "lll"
    "" => "Choose something…"
  ]
}

but no idea how I can move it as the first element of the collection. I simply cannot use array_merge because I'm dealing with instance of Illuminate\Database\Eloquent\Collection rather than array so this answer won't work.

Any hints? Thanks.

2 Answers 2

43
$foo = ['' => 'Choose something…'] + $foo->all();

If your $foo must be a collection instance, simply wrap it in a collection again:

$foo = collect(['' => 'Choose something…'] + $foo->all());

I submitted a PR to laravel to allow you to pass a key to prepend. If you're using Laravel 5.1.24 or newer, you can now do this:

$foo = $this->fooRepository->all()
            ->lists('name', 'id')
            ->prepend('Choose something…', '');

Later versions of Laravel have renamed the lists method to pluck. If you're using relatively modern version of Laravel, use pluck instead:

$foo = $this->fooRepository->all()
            ->pluck('name', 'id')
            ->prepend('Choose something…', '');
Sign up to request clarification or add additional context in comments.

3 Comments

@slick - what do you mean? Where, what and why did you have to change?
Now it's worth mentioning that lists has been deprecated and pluck should be used instead.
->prepend('Choose something…', ''); worked amazingly!
2

Try using ->prepend()

http://laravel.com/api/5.1/Illuminate/Database/Eloquent/Collection.html#method_prepend

$foo->prepend('Choose Something')


This won't give the correct result. The index would be 0 instead of an empty string. Instead you could try something like this

$foo = $foo->reverse()->put('Choose Something')->reverse()

But using @Joseph Silber answer is probably better.

3 Comments

This will set the key to 0. The OP wants the key to be an empty string.
Yep, you're absolutely correct. Could do something like $foo->reverse()->put(‘Choose Something’)->reverse() instead
thanks, Is there any better way like "array_unshift()" in arrays?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.