2

i have the following response, how to sort it depending on the distnace

{
  "Message": "Done.",
  "Status": true,
  "InnerData": [
      {
         "id": 66,
         "name": "tito",
         "distance": 74,
      },
      {
         "id": 67,
         "name": "liver pool",
         "distance": 83
      },
      {
         "id": 67,
         "name": "Text",
         "distance": 72
      }
  ]
}

i tried the usort but i didn't make it. i also tried this answer here but it seems to be different than the one i need

4
  • you can sort it in sql. But in your situation just use foreach loops and sort it manual. Commented May 21, 2018 at 14:08
  • You need to decode the JSON into a PHP data structure, sort it, then re-encode it. Post what you've tried and we can help you debug it. Commented May 21, 2018 at 14:11
  • the distance parameter is not a sql field, i calculate it and pass it in the response. can you please give me an example how to sort it using foreach ? Commented May 21, 2018 at 14:11
  • stackoverflow.com/questions/1597736/… Commented May 21, 2018 at 14:16

3 Answers 3

4

In pure PHP 7

<?php

$json = '{
  "Message": "Done.",
  "Status": true,
  "InnerData": [
      {
         "id": 66,
         "name": "tito",
         "distance": 74
      },
      {
         "id": 67,
         "name": "liver pool",
         "distance": 83
      },
      {
         "id": 67,
         "name": "Text",
         "distance": 72
      }
  ]
}';
$array = json_decode($json, true);
usort($array['InnerData'], function($a, $b) {
    return $a['distance'] <=> $b['distance'];
});

print_r($array);
Sign up to request clarification or add additional context in comments.

1 Comment

This is great ! Could you also perform additional checks for id and name as usort() doesn't guarantee a stable sort for order of equal elements. In this context, the OP might want to preserve the order.
3

As @hdifen suggested, if you're using Laravel it's a breeze to do this.

$json = '{
  "Message": "Done.",
  "Status": true,
  "InnerData": [
      {
         "id": 66,
         "name": "tito",
         "distance": 74
      },
      {
         "id": 67,
         "name": "liver pool",
         "distance": 83
      },
      {
         "id": 67,
         "name": "Text",
         "distance": 72
      }
  ]
}';

$data = json_decode($json, true);

$data['InnerData'] = collect($data['InnerData'])->sortBy('distance', SORT_REGULAR, true);

$encoded = json_encode($data);

echo $encoded;

Output:

{  
   "Message":"Done.",
   "Status":true,
   "InnerData":{  
      "1":{  
         "id":67,
         "name":"liver pool",
         "distance":83
      },
      "0":{  
         "id":66,
         "name":"tito",
         "distance":74
      },
      "2":{  
         "id":67,
         "name":"Text",
         "distance":72
      }
   }
}

Comments

0

Json is mainly used as a common format for sending data.

In Laravel you can convert a json object to a php array easily by using json_decode().

$phpArray = json_decode($json);

From here you can convert it to a collection to take advantage of laravels collection functions.

$laravelArray = collect($phpArray);

After this take a look at https://laravel.com/docs/5.5/collections to do sort/filter or do whatever you want to the array.

Comments

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.