tags:

views:

81

answers:

5

but according to this: http://www.php.net/manual/en/function.json-encode.php#94157 it won't.

I'm using flot so I need to have an array with numeric indexes returned but what I'm getting is this:

jsonp1282668482872 ( {"label":"Hits 2010-08-20","data":{"1281830400":34910,"1281916800":45385,"1282003200":56928,"1282089600":53884,"1282176000":50262,"1281657600":45446,"1281744000":34998}} );

so flot is choking. If I var_dump the array right before I call json_encode it looks like this:

array(7) {
  [1281830400]=>
  int(34910)
  [1281916800]=>
  int(45385)
  [1282003200]=>
  int(56928)
  [1282089600]=>
  int(53884)
  [1282176000]=>
  int(50262)
  [1281657600]=>
  int(45446)
  [1281744000]=>
  int(34998)
}

any ideas?

+3  A: 

It's conceptually impossible. You cannot encode an array with fixed indices in JSON.

As a reminder, a JSON array looks like this:

[1, 2, 3, 4, 5]

There's no room to put indices there.

You should work on the Javascript side. Accepting that json_encode will return an object, you can convert this object into an array. That shouldn't be too hard.

function toArray(object)
{
    var result = [];
    for (var key in object)
    {
        if (!key.match(/^[0-9]+$/)) throw new Error("Key must be all numeric");
        result[parseInt(key)] = object[key];
    }
    return result;
}
zneak
I think it would make more sense to fix the array on the PHP-size if the OP has control over it, which it sounds like they do. For one, it should be marginally faster and will result in (barely) less data sent to the client.
pr1001
@pr1001: you'll lose all key information if you do. Since the keys are timestamps, I believe they're important.
zneak
I agree, but as pkh and I posted, I think he's mistaken on the array format he needs in the first place.
pr1001
A: 

You can use array_merge to reindex a numerically indexed array, like this:

$a = array(2 => 3, 4 => 5);
$a = array_merge($a);
var_dump($a);
Robin
He'll lose the key, and the key seems important.
zneak
In that case he needs a JSON object, an array won't do this.
Robin
A: 

You can force json_decode() to produce arrays by passing TRUE as the second parameter, but you can't force json_encode() to produce arrays in the first place:

json_decode($json, TRUE); // force array creation
Marc B
+3  A: 

As zneak says, Javascript (and thus JSON) arrays cannot have out-of-order array keys. Thus, you either need to accept that you'll be working with JSON objects, not arrays, or call array_values before json_encode:

json_encode(array_values($data));

However, it looks like you're looking to display time series data with flot. As you can see on the flot time series example, it should be a two element array like so:

$.plot(
  $('#placeholder'),
  [[
    [1281830400, 34910],
    [1281916800, 45385],
    [1282003200, 56928],
    [1282089600, 53884],
    [1282176000, 50262],
    [1281657600, 45446],
    [1281744000, 34998]
  ]],
  {
    label: 'Hits 2010-08-20',
    xaxis: {mode: 'time'}
  }
)

Given your array (let's call it $data) we can get the proper JSON like so:

json_encode(
  array_map(
    function($key, $value) { return array($key, $value); },
    array_keys($data),
    array_values($data)
  )
);
pr1001
That's great, I achieved the same result by generating the JSON with a loop but I like your solution better. Thanks!
Andrew Watson
Glad to help. Please mark it as the answer if you feel that it answers your question.
pr1001
A: 

For flot, what you're asking for isn't actually what you want. You want an array of arrays, not an array of numbers. That is, you want something that looks like this:

  [[1281830400, 34910],
   [1281916800, 45385],
   [1282003200, 56928],
   [1282089600, 53884],
   [1282176000, 50262],
   [1281657600, 45446],
   [1281744000, 34998]]

As for how to do that in PHP, I'm not sure.

pkh