1

I have some case like this:

I have json data:

[{
        "1377412272": {
            "user_id": "1374050643",
            "date": "2013-08-24",
            "ip": "::1"
        }
    },
    {
        "1377412279": {
            "user_id": "1374050643",
            "date": "2013-08-25",
            "ip": "::1"
        }
    }
    , {
        "1377412287": {
            "user_id": "1377346094",
            "date": "2013-08-25",
            "ip": "::1"
        }
    }, {
        "1377413058": {
            "user_id": "1374050643",
            "date": "2013-08-25",
            "ip": "::1"
        }
    },
    {
        "1377413069": {
            "user_id": "1377346094",
            "date": "2013-08-25",
            "ip": "::1"
        }
    }
    , {
        "1377413074": {
            "user_id": "1377346094",
            "date": "2013-08-25",
            "ip": "::1"
        }
    },
    {
        "1377413079": {
            "user_id": "1377346094",
            "date": "2013-08-25",
            "ip": "::1"
        }
    }
]

An then, I have convert to array PHP

$newArr = array();
        foreach ($view['con'] as $key => $value) {
            foreach ($value as $k => $v) { 
                if (isset($newArr[$v['user_id']][$v['date']])) {
                    $newArr[$v['user_id']][$v['date']]++;
                } 
                else
                    $newArr[$v['user_id']][$v['date']] = 1; 
                $newArr[$v['user_id']][$v['date']] = isset($newArr[$v['user_id']][$v['date']]) ? $newArr[$v['user_id']][$v['date']]++ : 1;
            }
        }

Script above have result in json_encode with structure like this:

Array
( 
    [A] => Array
        (
            [2013-08-24] => 1
            [2013-08-25] => 2
        )

    [B] => Array
        (
            [2013-08-25] => 4
        )

)

and finally, I want it to be javascript object

[
  ["date","A","B"],
  [2013-08-24,1,0],
  [2013-08-25,2,4]
]

How to make it?...

5 Answers 5

1

To get output like this yo should do

$countArr = array();
foreach ($data as $key => $value)
{
    foreach ($value as $k => $v)
    {
        if (isset($countArr[$v['date']][$v['user_id']]))
        {
            $countArr[$v['date']][$v['user_id']]++;
        }
        else
        {
            $countArr[$v['date']][$v['user_id']] = 1;
        }
    }
}
$newArr = array();
foreach ($countArr as $date => $val)
{
    $row = array($date);
    $newArr[] = array_merge(array($date), array_values($val));
}
echo "<pre>";
print_r($newArr);
echo json_encode($newArr)

If you print out $newArr it will look like this

Array
(
    [0] => Array
        (
            [0] => 2013-08-24
            [1] => 1
        )

    [1] => Array
        (
            [0] => 2013-08-25
            [1] => 2
            [2] => 4
        )

)

json_encode will output

[["2013-08-24",1],["2013-08-25",2,4]]
0

I'm afraid you need to code everything manually. One (not too simple) solution is this:

<?php
$ori_list = array(
    'A'=> array(
        '2013-08-24' => 1,
        '2013-08-25' => 2,
    ),
    'B'=> array(
        '2013-08-24' => 3,
    ),
);

$modif_list = array();

// prepare the header
$header = array('date');
foreach($ori_list as $key=>$val){
    if(!array_key_exists($key, $header)){
        $header[] = $key;
    }
}
$modif_list[] = $header;

// prepare the date_list
$date_list = array();
foreach($ori_list as $key=>$val){
    foreach($val as $date=>$num){
        // add the initial row for every date
        $registered = false;
        foreach($date_list as $date_row){
            if($date_row[0] == $date){
                $registered = true;
                break;
            }
        }
        if(!$registered){
            $date_row = array($date);
            for($i=0; $i<count($header)-1; $i++){
                $date_row[] = 0;
            }
            $date_list[] = $date_row;
        }
        // put the right value to the right row
        $first_index = 0;
        $second_index = 0;
        for($i=1; $i<count($header); $i++){
            if($header[$i] == $key){
                $second_index = $i;
                break;
            }
        }
        for($i=0; $i<count($date_list); $i++){
            if($date == $date_list[$i][0]){
                $first_index = $i;
                break;
            }
        }
        $date_list[$first_index][$second_index] = $num;
    }
}
$modif_list[] = $date_list;

echo 'The PHP';
echo '<pre>';
var_dump($modif_list);
echo '</pre>';

echo 'The JSON';
echo '<pre>';
echo json_encode($modif_list);
echo '</pre>';
?>

The code will produce something like this (which I hope is what you want):

The PHP
array(2) {
  [0]=>
  array(3) {
    [0]=>
    string(4) "date"
    [1]=>
    string(1) "A"
    [2]=>
    string(1) "B"
  }
  [1]=>
  array(2) {
    [0]=>
    array(3) {
      [0]=>
      string(10) "2013-08-24"
      [1]=>
      int(1)
      [2]=>
      int(3)
    }
    [1]=>
    array(3) {
      [0]=>
      string(10) "2013-08-25"
      [1]=>
      int(2)
      [2]=>
      int(0)
    }
  }
}
The JSON
[["date","A","B"],[["2013-08-24",1,3],["2013-08-25",2,0]]]
1
  • @goFrendiAsgrard great, this what I want.. +1 Commented Aug 24, 2013 at 6:32
0

PHP

$arr = array("id"=>"1");
json_encode($arr);

Javascript + PHP

var json = jQuery.parseJSON(<?=$arr?>);
var id = json.id;
1
  • it's not work.. I just want to make Array ( [A] => Array ( [2013-08-24] => 1 [2013-08-25] => 2 ) [B] => Array ( [2013-08-25] => 4 ) ) Tobe [ ["date","A","B"], [2013-08-24,1,0], [2013-08-25,2,4] ] Commented Aug 24, 2013 at 5:49
0

I think this is what you want

$newArray = array
( 
    "A" => array
        (
            "2013-08-24" => 1,
            "2013-08-25" => 2
        ),

    "B" => array
        (
            "2013-08-25" => 4
        )

);

$uids=array();
$da = array();

foreach($na as $uid => $value)
{
    $uids[] = $uid;     
    foreach($value as $date => $count)
    {
        $da[$date][$uid]=$count;
    }
}


$ra = array(array("date"));

foreach($uids as $uid)
{
    $ra[0][] = $uid;
}
$i = 1;
foreach($da as $date => $value)
{
    $ra[$i][] = $date;
    foreach($uids as $uid)
    {
        if(array_key_exists($uid,$value))
        {
            $ra[$i][] = $value[$uid];
        }
        else
        {
            $ra[$i][] = 0;
        }
    }
    $i++;
}
print(json_encode($ra));

Output:

[["date","A","B"],["2013-08-24",1,0],["2013-08-25",2,4]]

0

In php, lets call it array.php:

// Your final statment of your array.php script must be an echo statment to send the array to jQuery
$ar = array('item1' => 'value1');
$ret_val['a'] = $ar;
echo json_encode($ret_val); 

In jQuery (for example, in the callback of $.post, but you can use $.ajax as well)

$.post("/path/to/array.php,

    null, // not passing any values to array.php

    function(data) {
        console.log (data.a.item1); // writes 'value1' to the console

        // (note that the 'a' in data.a.item1 in jQuery is the same as the 'a' in $ret_val in PHP)

    },

    "json");    
}

Then you deal with the return value anyway you like, including creating the final object you seek.

3
  • FYI, the data argument of $.post is optional, so you don't need to pass that null there. Also, for this use case $.get is preferable. Commented Aug 24, 2013 at 6:14
  • thanks gresso, but it's not seems like I want, I have convert array php to json_encode: [code] {"1374050643":{"2013-08-24":1,"2013-08-25":2},"1377346094":{"2013-08-25":4}} [/code] And I want make it tobe [code] [ ["date","A","B"], [2013-08-24,1,0], [2013-08-25,2,4] ] [/code] Can you help me?? Commented Aug 24, 2013 at 6:20
  • Just make sure your last statement in your php file is echo json_encode as I have shown you and you get everything working. Read the comments in the code, it will help. If you already have the json_encode done, then just echo it in our final statement of your script. Commented Aug 24, 2013 at 6:22

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.