在PHP中如何在关联数组中将行转换为列名

在PHP中如何在关联数组中将行转换为列名,php,mysql,arrays,json,associative-array,Php,Mysql,Arrays,Json,Associative Array,我想在PHP中将关联数组中的行转换为列名。我的数据以关联数组格式存储在单个变量$salesone中 下面是存储在变量$salesone中的数据 [{"Datetime":"2011-01-31", "Make":"Datsun", "Sales":0}, {"Datetime":"2011-02-28", "Make":"Datsun", "Sales":0}, {"Datetime":"2011-03-31", "Make":"Datsun", "Sales":0}, {"Datetim

我想在PHP中将关联数组中的行转换为列名。我的数据以关联数组格式存储在单个变量
$salesone

下面是存储在变量
$salesone
中的数据

[{"Datetime":"2011-01-31", "Make":"Datsun", "Sales":0},
 {"Datetime":"2011-02-28", "Make":"Datsun", "Sales":0},
 {"Datetime":"2011-03-31", "Make":"Datsun", "Sales":0},
 {"Datetime":"2011-01-31", "Make":"Fiat", "Sales":2150},
 {"Datetime":"2011-02-28", "Make":"Fiat", "Sales":1839},
 {"Datetime":"2011-03-31", "Make":"Fiat", "Sales":1860},
 {"Datetime":"2011-01-31", "Make":"Ford", "Sales":10026},
 {"Datetime":"2011-02-28", "Make":"Ford", "Sales":9293},
 {"Datetime":"2011-03-31", "Make":"Ford", "Sales":10485}]
但谷歌的折线图无法解释它来绘制折线图。它给了我以下错误:

'给定轴上的所有数据必须是相同的数据类型'


我想要以下格式的数据:

[{"Datetime":"2011-01-31", "Datsun":0, "Fiat":2150, "Ford":10026},
{"Datetime":"2011-02-28", "Datsun":0, "Fiat":1839, "Ford":9293},
{"Datetime":"2011-01-31", "Datsun":0, "Fiat":1860, "Ford":10845}]

如何在PHP中以编程方式转换此数据?(它作为关联数组存储在
$salesone
变量中)。

请使用以下代码进行输出:

<?php
$number = '[{"Datetime":"2011-01-31","Make":"Datsun","Sales":0},
{"Datetime":"2011-02-28","Make":"Datsun","Sales":0},
{"Datetime":"2011-03-31","Make":"Datsun","Sales":0},
{"Datetime":"2011-01-31","Make":"Fiat","Sales":2150},
{"Datetime":"2011-02-28","Make":"Fiat","Sales":1839},
{"Datetime":"2011-03-31","Make":"Fiat","Sales":1860},
{"Datetime":"2011-01-31","Make":"Ford","Sales":10026},
{"Datetime":"2011-02-28","Make":"Ford","Sales":9293},
{"Datetime":"2011-03-31","Make":"Ford","Sales":10485}]';

$number = json_decode($number);
$output = array();
foreach($number as $value){
    $output[$value->Datetime]['Datetime'] = $value->Datetime;
    $output[$value->Datetime][$value->Make] = $value->Sales;
}
$output = array_values($output);
$output = json_encode($output);
echo $output;

您可以使用试试这个。希望它能起作用

    $string='[{"Datetime":"2011-01-31", "Make":"Datsun", "Sales":0},
     {"Datetime":"2011-02-28", "Make":"Datsun", "Sales":0},
     {"Datetime":"2011-03-31", "Make":"Datsun", "Sales":0},
     {"Datetime":"2011-01-31", "Make":"Fiat", "Sales":2150},
     {"Datetime":"2011-02-28", "Make":"Fiat", "Sales":1839},
     {"Datetime":"2011-03-31", "Make":"Fiat", "Sales":1860},
     {"Datetime":"2011-01-31", "Make":"Ford", "Sales":10026},
     {"Datetime":"2011-02-28", "Make":"Ford", "Sales":9293},
     {"Datetime":"2011-03-31", "Make":"Ford", "Sales":10485}]';

    $array=json_decode($string,true);
    $newArray=array();
    $keyArray=array();
    $indexArray=array();
    $index=0;
    foreach ($array as $position => $dataArray)
    {
        if(!in_array($array[$position]['Datetime'], $keyArray))
        {
            $keyArray[]=$array[$position]['Datetime'];
            $indexArray[$array[$position]['Datetime']]=$index;
            $index++;
        }
    }
    foreach($array as $position => $dataArray)
    {
        foreach($dataArray as $key => $value)
        {
            if($key=='Datetime' && empty($newArray[$indexArray[$value]]['Datetime']))
            {
                $newArray[$indexArray[$value]]['Datetime']=$value;
            }
            else
            {
                $indexArray[$array[$position]['Datetime']];
                $newArray[$indexArray[$array[$position]['Datetime']]][$dataArray['Make']]=$dataArray['Sales'];
                break;
            }
        }
    }
    print_r($newArray);

    $newArray1=array();
    $colIndex=0;
    foreach($newArray as $index => $dataArray)
    {
        foreach($dataArray as $key => $value)
        {
            if(count($newArray1['cols'])!=4)
            {
                $type=($key=='Datetime') ? 'date' : 'string';
                $newArray1['cols'][$colIndex]['label']=$key;
                $newArray1['cols'][$colIndex]['type']=$type;
                $colIndex++;
            }
            else
            {
                $colIndex=0;
            }
            if(preg_match('/^([\d]{4})-([\d]{2})-([\d]{2})$/',$value,$matches))
            {
                $value='Date('.$matches[1].', '.$matches[2].', '.$matches[3].')';
            }
            $newArray1['rows'][$index]['c'][]['v']=$value;;
        }
    }
    print_r($newArray1);

这将为您的问题提供准确的答案。

您的输出如下:[{“Datetime”:“2011-01-31”,“Datsun”:0,“菲亚特”:2150,“福特”:10026},{“Datetime”:“2011-02-28”,“Datsun”:0,“菲亚特”:1839,“福特”:9293},{“Datetime”:“2011-03-31”,“Datsun”:0,“菲亚特”:1860,“福特”:10485}]非常感谢。非常感谢你的帮助。如果我想再次像这样转换这个字符串:
{“cols”:[{“label”:“Datetime”,“type”:“date”},{“label”:“Datsun”,“type”:“string”},{“label”:“Fiat”,“type”:“string”}],“rows”:[{“c”:[{“v”:“date 2011,0,31)”},{“v”:“0”},{“v”:2150},{“c”:“v”:“date}]}.
有什么办法可以做到这一点吗?感谢拉胡尔对我上述代码的回答,如:{“cols”:[{“label”:“Datetime”,“type”:“date”},{“label”:“type”:“string”},{“label”:“Fiat”,“type”:“string”},{“label”:“Ford”,“type”:“string”},{“rows”:[{“c”:[{“v”:“date(1970,1,1)“},{“v”:0},{“v”:1839},{“v”:9293},{“c”:[{“v”:“date(1970,1,1)”},{“v”:0},{“v”:1860},{“v”:10485}]}与您的答案匹配非常感谢javedrathod。但它给了我一个错误“遇到了一个格式不正确的数值”。在这一行代码
$newOutput['rows'][$counter['c']['c']['v'=($key==“$Datetime=”($date date date('Y,n,j',$innerValue)。”:$innerValue;
只需首先确定日期,并在PHP条件函数中使用它。非常感谢Sahil。非常感谢您的方法。但是google图表需要为google图表定义行和列。现在我需要对输出格式进行一个小的修改。我想修改它如下:`{“cols”:[{“标签”;“日期时间”;“类型”;“日期”;“标签”;“日期”;“类型”;“字符串”;“标签”;“格式”;“字符串”;“行”;“{”c:“{”v:“日期(2011,0,31)”,{”v:“日期”;{”v:“日期(2011,1,28)”,{”c:“{”日期(2011,1,28)”,{”v:“日期(2011,2,31)”,{”c:{”v:“:“日期(2011,2,31)”,{”v:“欢迎您的光临:{您的结果是这种格式吗?@sahil…我需要为json数据定义行和列,因为google charts无法解释没有行和列的图形。@rahul16590抱歉,我花了很长时间..bcoz..我在办公室时回答问题..但我必须感谢您的问题…我编辑了我的答案。。。。
    $string='[{"Datetime":"2011-01-31", "Make":"Datsun", "Sales":0},
     {"Datetime":"2011-02-28", "Make":"Datsun", "Sales":0},
     {"Datetime":"2011-03-31", "Make":"Datsun", "Sales":0},
     {"Datetime":"2011-01-31", "Make":"Fiat", "Sales":2150},
     {"Datetime":"2011-02-28", "Make":"Fiat", "Sales":1839},
     {"Datetime":"2011-03-31", "Make":"Fiat", "Sales":1860},
     {"Datetime":"2011-01-31", "Make":"Ford", "Sales":10026},
     {"Datetime":"2011-02-28", "Make":"Ford", "Sales":9293},
     {"Datetime":"2011-03-31", "Make":"Ford", "Sales":10485}]';

    $array=json_decode($string,true);
    $newArray=array();
    $keyArray=array();
    $indexArray=array();
    $index=0;
    foreach ($array as $position => $dataArray)
    {
        if(!in_array($array[$position]['Datetime'], $keyArray))
        {
            $keyArray[]=$array[$position]['Datetime'];
            $indexArray[$array[$position]['Datetime']]=$index;
            $index++;
        }
    }
    foreach($array as $position => $dataArray)
    {
        foreach($dataArray as $key => $value)
        {
            if($key=='Datetime' && empty($newArray[$indexArray[$value]]['Datetime']))
            {
                $newArray[$indexArray[$value]]['Datetime']=$value;
            }
            else
            {
                $indexArray[$array[$position]['Datetime']];
                $newArray[$indexArray[$array[$position]['Datetime']]][$dataArray['Make']]=$dataArray['Sales'];
                break;
            }
        }
    }
    print_r($newArray);

    $newArray1=array();
    $colIndex=0;
    foreach($newArray as $index => $dataArray)
    {
        foreach($dataArray as $key => $value)
        {
            if(count($newArray1['cols'])!=4)
            {
                $type=($key=='Datetime') ? 'date' : 'string';
                $newArray1['cols'][$colIndex]['label']=$key;
                $newArray1['cols'][$colIndex]['type']=$type;
                $colIndex++;
            }
            else
            {
                $colIndex=0;
            }
            if(preg_match('/^([\d]{4})-([\d]{2})-([\d]{2})$/',$value,$matches))
            {
                $value='Date('.$matches[1].', '.$matches[2].', '.$matches[3].')';
            }
            $newArray1['rows'][$index]['c'][]['v']=$value;;
        }
    }
    print_r($newArray1);