Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

sorting doesn't work in laravel http response

When I try to do asort($data) and then return it like response()->json($data, 200), the output is still in its original position.

Here's the code:

$fruits = array( 'guava', 'apple', 'orange' );
asort( $fruits );
return response()->json( $fruits, 200 );

then the output is still in its position.

{
  0: "guava",
  1: "apple",
  2: "orange"
}

But when I try to dump the data just after the sorting happen, like

$fruits = array( 'guava', 'apple', 'orange' );
asort( $fruits );
dd( $fruits );

I'm getting the right position of data.

array:3 [
  1 => "apple"
  0 => "guava"
  2 => "orange"
]

Any idea, why this happen? and how can I solve this? Im using Laravel 5.1

like image 803
kjames Avatar asked Oct 30 '22 23:10

kjames


1 Answers

The fact that you can have an array with numerical index out of order in php is purely a php thing.

The json output shouldn't care about that.. it's possible that json_encode is called on the fly, or that what you're seeing is simply an optimisation from the browser (it is an object {}).

See this SO question that has some valuable input regarding this: Prevent json_encode associative array sorting.

However in your context, unless you really care about the index, asort is probably not what you want. You want sort.

Edit if you want to maintain both order and key assoc, you need to change the structure to an array of object {key,value}

Edit 2 you can reduce your array to that structure like this (php 5.4+):

$fruits = array_map(function($index,$value) {
        return ['index'=>$index,'value'=>$value];
    },array_keys($fruits),$fruits);
like image 193
Ben Avatar answered Nov 09 '22 15:11

Ben