首页 > 解决方案 > 数组只替换特定键的值

问题描述

我有两个数组,在 json 中是这样的(标签):

[
    {
      "dates": "2019-07-01",
      "c_job": 0
    },
    {
      "dates": "2019-07-02",
      "c_job": 0
    },
    {
      "dates": "2019-07-03",
      "c_job": 0
    },
    {
      "dates": "2019-07-04",
      "c_job": 0
    }
  ]

以及来自数据库的其他数据(数据):

{
    "EXPORT": [
      {
        "dates": "2019-07-01",
        "c_job": 12
      },
      {
        "dates": "2019-07-02",
        "c_job": 8
      },
      {
        "dates": "2019-07-04",
        "c_job": 11
      }
    ],
    "IMPORT": [
      {
        "dates": "2019-07-03",
        "c_job": 11
      }
    ]
}

之后,我尝试使用以下代码进行数组替换以使用标签使数据精度:

foreach($data as $key => $value) {
            $datafinal[$key] = array_replace($label,$value);
        }

输出是 (datafinal) :

{
    "EXPORT": [
      {
        "dates": "2019-07-01",
        "c_job": 12
      },
      {
        "dates": "2019-07-02",
        "c_job": 8
      },
      {
        "dates": "2019-07-04",
        "c_job": 11
      },
      {
        "dates": "2019-07-04",
        "c_job": 0
      }
    ],
    "IMPORT": [
      {
        "dates": "2019-07-03",
        "c_job": 11
      },
      {
        "dates": "2019-07-02",
        "c_job": 0
      },
      {
        "dates": "2019-07-03",
        "c_job": 0
      },
      {
        "dates": "2019-07-04",
        "c_job": 0
      }
    ]
  }

我想要的是这样的:

{
    "EXPORT": [
      {
        "dates": "2019-07-01",
        "c_job": 12
      },
      {
        "dates": "2019-07-02",
        "c_job": 8
      },
      {
        "dates": "2019-07-03",
        "c_job": 0
      },
      {
        "dates": "2019-07-04",
        "c_job": 11
      }
    ],
    "IMPORT": [
      {
        "dates": "2019-07-01",
        "c_job": 0
      },
      {
        "dates": "2019-07-02",
        "c_job": 0
      },
      {
        "dates": "2019-07-03",
        "c_job": 11
      },
      {
        "dates": "2019-07-04",
        "c_job": 0
      }
    ]
  }

我尝试了数组减少和替换

标签: phparraysjson

解决方案


基本上你需要做的是对于每个顶级数组$data,遍历 0 值数组(我称之为它$blank)并查看当前$data数组中是否存在日期。如果是,则复制该值,否则使用空白值:

$datafinal = array();
foreach ($data as $key => $value) {
    foreach ($blank as $bkey => $bvalue) {
        if (($dkey = array_search($bvalue['dates'], array_column($value, 'dates'))) !== false) {
            $datafinal[$key][$bkey] = $value[$dkey];
        }
        else {
            $datafinal[$key][$bkey] = $bvalue;
        }
    }
}
echo json_encode($datafinal, JSON_PRETTY_PRINT);

输出:

{
    "EXPORT": [
        {
            "dates": "2019-07-01",
            "c_job": 12
        },
        {
            "dates": "2019-07-02",
            "c_job": 8
        },
        {
            "dates": "2019-07-03",
            "c_job": 0
        },
        {
            "dates": "2019-07-04",
            "c_job": 11
        }
    ],
    "IMPORT": [
        {
            "dates": "2019-07-01",
            "c_job": 0
        },
        {
            "dates": "2019-07-02",
            "c_job": 0
        },
        {
            "dates": "2019-07-03",
            "c_job": 11
        },
        {
            "dates": "2019-07-04",
            "c_job": 0
        }
    ]
}

3v4l.org 上的演示


推荐阅读