【问题标题】:Add elements to array in specific format以特定格式将元素添加到数组
【发布时间】:2017-03-15 18:47:26
【问题描述】:

我有一个名为 $paises 的数组:

Array
(
    [0] => Array
        (
            [life_sciences] => Array
                (
                    [0] => Array
                        (
                            [value] => Life Sciences
                        )

                    [1] => Array
                        (
                            [value] => 226
                        )

                    [2] => Array
                        (
                            [value] => 433
                        )

                    [3] => Array
                        (
                            [value] => 816
                        )


                )
            [telecom] => Array
                (
                    [0] => Array
                        (
                            [value] => Telecom
                        )

                    [1] => Array
                        (
                            [value] => 10
                        )

                    [2] => Array
                        (
                            [value] => 20
                        )

                    [3] => Array
                        (
                            [value] => 30
                        )


                )
        )
)

我需要在另一个 json 格式的数组中转换,就像这样:

{
    "dataset": [
        {
          "seriesname": "Life Sciences",
          "data": [{"value": "226"}, {"value": "433"}, {"value": "816"}]
        },
        {
          "seriesname": "Telecom",
          "data": [{"value": "10"}, {"value": "20"}, {"value": "30"}]
        },
        .
        .
        .
    ]
}

我在做什么返回错误的数组格式:

$chart = array();

for ($i=0; $i < count($paises); $i++) {

        // here i get the value from index 0
        $chart["dataset"][]['seriesname'] = $paises[$i]['life_sciences'][0]['value'];

        // Here i remove the index 0 and reaorder the array indexes
        unset($paises[$i]['life_sciences'][0]);
        array_splice($paises[$i]['life_sciences'], 1, 1);

        // Here i get all values
        $chart["dataset"][]['data'] = $paises[$i]['life_sciences'];

}

结果:

{
    "dataset": [
        {
            "seriesname":"Life Sciences"
        },
        {
            "data":[{"value":"226"},{"value":"816"},{"value":"1098"}]
        },
        {
            "seriesname":"Telecom"
        },
        {
            "data":[{"value":"10"},{"value":"20"},{"value":"30"}]
        },
        .
        .
        .
    ]
}

注意“seriesname”与“data”是分开的:

{ "seriesname":"Life Sciences" }, { "data":[{"value":"226"},...] }

但我需要的是:

{ "seriesname":"Life Sciences" , "data":[{"value":"226"},...] }

我怎样才能以正确的方式做到这一点?

########## 编辑 1

我用过:

$chart = array();

for ($i=0; $i < count($paises); $i++) {

        $chart["dataset"][$i]['seriesname'] = $paises[$i]['life_sciences'][0]['value'];
        $chart["dataset"][$i]['data'] = $paises[$i]['life_sciences'];

        $chart["dataset"][$i]['seriesname'] = $paises[$i]['telecom'][0]['value'];
        $chart["dataset"][$i]['data'] = $paises[$i]['telecom'];

}

但只返回“电信”元素,忽略“生命科学”

【问题讨论】:

    标签: php arrays json


    【解决方案1】:

    [] 运算符在您每次使用时都会创建一个新的数组元素。所以当你这样做时:

    $chart["dataset"][]['seriesname'] = $paises[$i]['life_sciences'][0]['value'];
    

    你正在添加一个新元素,当你这样做时:

    $chart["dataset"][]['data'] = $paises[$i]['life_sciences'];
    

    您正在添加另一个新元素。您可以同时添加它们:

    $char["dataset"][] = [
        "seriesname" => ...
        "data" => ...
    ];
    

    或者明确指定你的新索引:

    $chart["dataset"][$i]['seriesname'] = ...
    $chart["dataset"][$i]['data'] = ...
    

    【讨论】:

    • 谢谢亚历克斯,但对我不起作用,我用新问题编辑了问题
    【解决方案2】:

    试试这个重新格式化数组。

    <?php
    
    $json = '{
        "dataset": [
            {
              "seriesname": "Life Sciences",
              "data": [{"value": "226"}, {"value": "433"}, {"value": "816"}]
            }
        ]
    }';
    
    $data = json_decode($json)->dataset;
    
    foreach ($data as $series) {
        $tempArr = Array();
        foreach ($series->data as $value) {
            array_push($tempArr, $value);
        }
        $series->data = $tempArr;
    }
    
    print_r($data);
    
    
    ?>
    

    访问您的数据:

    $data->data
    

    或物种名称:

    $data->seriesname
    

    【讨论】:

      【解决方案3】:
      $chart["dataset"][] = array(
          "seriesname" => $paises[$i]['life_sciences'][0]['value'],
          "data" => array_slice($paises[$i]['life_sciences'], 1)
      );
      

      我认为这对自行车体来说是合适的

      编辑 1

      在你的版本之后,我考虑应用类似的东西

      $k = array_keys($paises[0]); // get array of keys names
      for ($i=0; $i < count($k); $i++) { // iterate key names
          $chart["dataset"][] = array(
              "seriesname" => $paises[0][$k[$i]][0]['value'],
              "data" => array_slice($paises[0][$k[$i]], 1) // array without first element
          );
      }
      

      使用 sn-p 来形成您的解决方案。

      如果需要,再添加一个外部循环以迭代 $paises

      【讨论】:

        【解决方案4】:

        您可以使用array_shift() 获取数组的第一个元素(并将其从数组中删除):

        function transformPaisesArray(array $paises): array
        {
            $transformedPaisesArray = [];
        
            foreach ($paises[0] as $series) {
        
                // Take the first element from the array.
                $name = array_shift($series)['value'];
                // Add this first element and the rest as a new record to the target array.
                $transformedPaisesArray[] = [
                    'seriesname' => $name,
                    'data' => $series
                ];
            }
        
            // Wrap everything into the dataset field.
            return ['dataset' => $transformedPaisesArray];
        }
        

        【讨论】:

          猜你喜欢
          • 2013-12-27
          • 2011-06-10
          • 2017-09-08
          • 2015-03-13
          • 1970-01-01
          • 2015-12-07
          • 2015-05-24
          • 1970-01-01
          • 2015-05-11
          相关资源
          最近更新 更多