dsbpac Posted July 5, 2015 Share Posted July 5, 2015 I'm having an issue sorting an array. I'm getting an error of "Warning: ksort() expects parameter 1 to be array, null given in" The print_r output of the array is Array ( [0] => Array ( [text] => 96.1 km [value] => 96113 ) [1] => Array ( [text] => 52.1 km [value] => 52096 ) [2] => Array ( [text] => 102 km [value] => 102064 ) [3] => Array ( [text] => 30.0 km [value] => 29992 ) [4] => Array ( [text] => 43.9 km [value] => 43864 ) [5] => Array ( [text] => 57.4 km [value] => 57408 ) [6] => Array ( [text] => 82.2 km [value] => 82154 ) [7] => Array ( [text] => 73.6 km [value] => 73620 ) [8] => Array ( [text] => 118 km [value] => 118016 ) [9] => Array ( [text] => 137 km [value] => 136921 ) [10] => Array ( [text] => 61.6 km [value] => 61574 ) [11] => Array ( [text] => 74.2 km [value] => 74193 ) [12] => Array ( [text] => 226 km [value] => 226166 ) [13] => Array ( [text] => 140 km [value] => 140145 ) [14] => Array ( [text] => 126 km [value] => 126140 ) [15] => Array ( [text] => 45.5 km [value] => 45520 ) [16] => Array ( [text] => 211 km [value] => 211070 ) [17] => Array ( [text] => 54.1 km [value] => 54145 ) [18] => Array ( [text] => 187 km [value] => 186855 ) [19] => Array ( [text] => 271 km [value] => 271334 ) [20] => Array ( [text] => 219 km [value] => 218848 ) [21] => Array ( [text] => 67.0 km [value] => 67016 ) [22] => Array ( [text] => 13.6 km [value] => 13591 ) [23] => Array ( [text] => 153 km [value] => 153396 ) [24] => Array ( [text] => 11.5 km [value] => 11492 ) ). All I want to do is be able to sort the array by the lowest number in either text or value and display that single number. <?php include 'config/db_functions.php'; //run the query $loop = mysql_query("SELECT * FROM NEW_Venues WHERE game_nights = '5' AND status = '1'") or die (mysql_error()); while ($row = mysql_fetch_array($loop)) { $postcode2 = $row['zip']; $venue = $row['venue']; $postcode1=('33071');; $url = "http://maps.googleapis.com/maps/api/distancematrix/json?origins=$postcode2&destinations=$postcode1&mode=driving&language=en-EN&sensor=false"; $data = @file_get_contents($url); $result = json_decode($data, true); ksort($items); foreach($result['rows'] as $distance) {; echo '' . $venue . ' - ' . $distance['elements'][0]['distance']['text'] . ' <br>'; $items[] = $distance['elements'][0]['distance']; $items1[] = $distance['elements'][0]['distance']; $itemsname[] = $venue; } } ksort($items1); foreach ($items1 as $key => $val) { echo "$key = $val <br>"; } print_r(array_values($items)); ?> Quote Link to comment https://forums.phpfreaks.com/topic/297185-sort-an-array-help/ Share on other sites More sharing options...
scootstah Posted July 5, 2015 Share Posted July 5, 2015 $items is not defined in the code you gave at the time of calling ksort(). You should be developing with E_NOTICE errors turned on. You would have seen the undefined variable error. ini_set('display_errors', 1); error_reporting(-1); Quote Link to comment https://forums.phpfreaks.com/topic/297185-sort-an-array-help/#findComment-1515611 Share on other sites More sharing options...
dsbpac Posted July 5, 2015 Author Share Posted July 5, 2015 I get this when turning those on. Strict Standards: ksort() [function.ksort]: It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'America/Chicago' for 'CDT/-5.0/DST' Quote Link to comment https://forums.phpfreaks.com/topic/297185-sort-an-array-help/#findComment-1515612 Share on other sites More sharing options...
scootstah Posted July 5, 2015 Share Posted July 5, 2015 You need to set a default timezone in your php.ini http://php.net/manual/en/datetime.configuration.php#ini.date.timezone Quote Link to comment https://forums.phpfreaks.com/topic/297185-sort-an-array-help/#findComment-1515613 Share on other sites More sharing options...
Barand Posted July 5, 2015 Share Posted July 5, 2015 (edited) Given your array looks like this: $data = Array ( 0 => Array ( 'text' => '96.1 km', 'value' => 96113 ), 1 => Array ( 'text' => '52.1 km', 'value' => 52096 ), 2 => Array ( 'text' => '102 km', 'value' => 102064 ), 3 => Array ( 'text' => '30.0 km', 'value' => 29992 ), 4 => Array ( 'text' => '43.9 km', 'value' => 43864 ),); then using ksort() will merely sort on the keys I highlighted in red. You will need a custom sort, using usort() to sort on the text values $data = Array ( 0 => Array ( 'text' => '96.1 km', 'value' => 96113 ), 1 => Array ( 'text' => '52.1 km', 'value' => 52096 ), 2 => Array ( 'text' => '102 km', 'value' => 102064 ), 3 => Array ( 'text' => '30.0 km', 'value' => 29992 ), 4 => Array ( 'text' => '43.9 km', 'value' => 43864 ), ); usort($data, function($a, $b) { return strnatcmp($a['text'], $b['text']); }); echo '<pre>',print_r($data, true),'</pre>'; which gives Array ( [0] => Array ( [text] => 30.0 km [value] => 29992 ) [1] => Array ( [text] => 43.9 km [value] => 43864 ) [2] => Array ( [text] => 52.1 km [value] => 52096 ) [3] => Array ( [text] => 96.1 km [value] => 96113 ) [4] => Array ( [text] => 102 km [value] => 102064 ) ) Alternatively, you can sort on the "value" values using usort($data, function($a, $b) { return $a['value'] - $b['value']); }); Edited July 5, 2015 by Barand Quote Link to comment https://forums.phpfreaks.com/topic/297185-sort-an-array-help/#findComment-1515617 Share on other sites More sharing options...
dsbpac Posted July 5, 2015 Author Share Posted July 5, 2015 I'm getting an syntax error, unexpected T_FUNCTION when I add usort($data, function($a, $b) {return strnatcmp($a['text'], $b['text']);});echo '<pre>',print_r($data, true),'</pre>'; Quote Link to comment https://forums.phpfreaks.com/topic/297185-sort-an-array-help/#findComment-1515628 Share on other sites More sharing options...
Ch0cu3r Posted July 5, 2015 Share Posted July 5, 2015 The code provided by Barand should be fine. Im guessing you are running a version of PHP which is older than PHP5.3 (this was released over 6 years ago!). You should consider updating PHP to a much newer version (ideally 5.4.x minimum or preferably php5.6.x) Anyway the alternative to Barands code would be not to use anonymous functions function sortValues($a, $b) { return strnatcmp($a['text'], $b['text']); } usort($data, 'sortValues'); Quote Link to comment https://forums.phpfreaks.com/topic/297185-sort-an-array-help/#findComment-1515631 Share on other sites More sharing options...
dsbpac Posted July 6, 2015 Author Share Posted July 6, 2015 Thank you everyone for your help!! I have my code working just as I want on my test hosting server that is running php version 5.2.17. When I move it over to the actual server I want to use it on that is running php version 5.3.29. its not displaying any type of input inside the foreach loop including a simple echo test text. Section of code the issue is in I think $url = "http://maps.googleapis.com/maps/api/distancematrix/json?origins=$postcode2&destinations=$postcode1&mode=driving&language=en-EN&sensor=false"; $data = @file_get_contents($url); $result = json_decode($data, true); foreach($result['rows'] as $distance) {; $items2[] = array( 'info' => $distance['elements'][0]['distance'], 'venue' => $venue, 'vid' => $vid, ); } FULL CODE <?php ini_set('display_errors', 1); error_reporting(-1); include 'config/db_functions.php'; //run the query $loop = mysql_query("SELECT * FROM NEW_Venues WHERE game_nights = '5' AND status = '1'") or die (mysql_error()); $items = null; $items1 = null; while ($row = mysql_fetch_array($loop)) { $postcode2 = $row['zip']; $venue = $row['venue']; $vid = $row['vid']; $postcode1=('33462');; $url = "http://maps.googleapis.com/maps/api/distancematrix/json?origins=$postcode2&destinations=$postcode1&mode=driving&language=en-EN&sensor=false"; $data = @file_get_contents($url); $result = json_decode($data, true); foreach($result['rows'] as $distance) {; $items2[] = array( 'info' => $distance['elements'][0]['distance'], 'venue' => $venue, 'vid' => $vid, ); } } function sortValues($a, $b) { return strnatcmp($a['info']['text'], $b['info']['text']); } usort($items2, 'sortValues'); $venueid = $items2[0]['vid']; $venuename = $items2[0]['venue']; echo "Sunday - $venuename<br>"; ?> Quote Link to comment https://forums.phpfreaks.com/topic/297185-sort-an-array-help/#findComment-1515712 Share on other sites More sharing options...
scootstah Posted July 6, 2015 Share Posted July 6, 2015 (edited) Probably because you have a syntax error. Turn error reporting on! foreach($result['rows'] as $distance) {; <--- Edited July 6, 2015 by scootstah Quote Link to comment https://forums.phpfreaks.com/topic/297185-sort-an-array-help/#findComment-1515713 Share on other sites More sharing options...
dsbpac Posted July 6, 2015 Author Share Posted July 6, 2015 I did already try taking that out. I copy and pasted the working original into here since I tried several things and didn't want an self made error. When i turn on error reporting i get Notice: Undefined offset: 1 line 16 Quote Link to comment https://forums.phpfreaks.com/topic/297185-sort-an-array-help/#findComment-1515714 Share on other sites More sharing options...
scootstah Posted July 6, 2015 Share Posted July 6, 2015 What is line 16? Quote Link to comment https://forums.phpfreaks.com/topic/297185-sort-an-array-help/#findComment-1515716 Share on other sites More sharing options...
dsbpac Posted July 6, 2015 Author Share Posted July 6, 2015 Okay I have been playing with this all day and decided to go back to the first script i started with and it's still producing the error. Warning: Invalid argument supplied for foreach() in <?php ini_set('display_errors', 1); error_reporting(-1); $postcode1=('CB13HR'); $postcode2=('CB23JX'); $url = "http://maps.googleapis.com/maps/api/distancematrix/json?origins=$postcode2&destinations=$postcode1&mode=driving&language=en- EN&sensor=false"; $data = @file_get_contents($url); $result = json_decode($data, true); foreach($result['rows'] as $distance) { echo 'Distance from you: ' . $distance['elements'][0]['distance']['text'] . ' (' . $distance['elements'][0]['duration']['text'] . ' in current traffic)'; } ?> I also tried to replace json_decode with json_decode( preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $json_string);, true ); and it returned nothing. Thanks for any and all help ahead of time. Quote Link to comment https://forums.phpfreaks.com/topic/297185-sort-an-array-help/#findComment-1515726 Share on other sites More sharing options...
mac_gyver Posted July 6, 2015 Share Posted July 6, 2015 (edited) edit: there is no $result['rows'] in your json decoded data. i recommend using the code/method you were given in this thread. Edited July 6, 2015 by mac_gyver Quote Link to comment https://forums.phpfreaks.com/topic/297185-sort-an-array-help/#findComment-1515727 Share on other sites More sharing options...
mac_gyver Posted July 6, 2015 Share Posted July 6, 2015 (edited) further to my reply above, if your previous code did have a $result['rows'] in the json decoded data, but it doesn't now, your file_get_contents() is likely failing. you should never use the @ error suppressor in any code. do you get any php errors from the code after you remove the @ in front of the file_get_contents() statement? Edited July 6, 2015 by mac_gyver Quote Link to comment https://forums.phpfreaks.com/topic/297185-sort-an-array-help/#findComment-1515731 Share on other sites More sharing options...
dsbpac Posted July 7, 2015 Author Share Posted July 7, 2015 First off let me thank everyone for their help so far. After trying a few different things and getting an error message. I figured out that allow_url_fopen is OFF. How would I go about CURL to get the data I'm requesting since I'm pretty sure that would be an alternative option. Quote Link to comment https://forums.phpfreaks.com/topic/297185-sort-an-array-help/#findComment-1515786 Share on other sites More sharing options...
mac_gyver Posted July 7, 2015 Share Posted July 7, 2015 there's a ton of curl examples to be found by searching the web. the following basic example should work for you (provided that the curl extension is enabled) - $url = "http://maps.googleapis.com/maps/api/distancematrix/json?origins=CB13HR&destinations=CB23JX&mode=driving&language=en-EN&sensor=false"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $result = json_decode(curl_exec($ch), true); echo '<pre>'; print_r($result); Quote Link to comment https://forums.phpfreaks.com/topic/297185-sort-an-array-help/#findComment-1515787 Share on other sites More sharing options...
dsbpac Posted July 8, 2015 Author Share Posted July 8, 2015 Thank you very much for your help. I was able to get the script up and running just like I wanted and it works perfect. Shout out to mac_gyver, scootstah, Ch0cu3r, and Barand for assisting me. Quote Link to comment https://forums.phpfreaks.com/topic/297185-sort-an-array-help/#findComment-1515883 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.