【问题标题】:Array merging / inserting not working数组合并/插入不起作用
【发布时间】:2018-11-09 02:47:25
【问题描述】:

现在这是我拥有的两个数组:

第一: “工作时间”: [ { “开幕”:“09:30”, “关闭”:“13:30”, "dayName": "星期天" }, { “开幕”:“”, “关闭”:“”, "dayName": "星期一" }, { “开幕”:“”, “关闭”:“”, "dayName": "星期二" }, { "开幕": "10:30", “关闭”:“06:30”, "dayName": "星期三" }, { “开幕”:“01:00”, "收盘": "08:00", "dayName": "星期四" }, { “开幕”:“”, “关闭”:“”, “dayName”:“星期五” }, { “开幕”:“”, “关闭”:“”, “dayName”:“星期六” }, ], 第二个: “折扣”: [ { "from_time": "13:00:00", "to_time": "14:50:00", “折扣”:“20”, "dayName": "星期三" }, { "from_time": "06:13:16", "to_time": "04:14:11", “折扣”:“20”, "dayName": "星期一" }, { "from_time": "05:10:15", "to_time": "06:10:17", “折扣”:“20”, "dayName": "星期二" }, { "from_time": "06:59:16", "to_time": "04:19:11", “折扣”:“20”, "dayName": "星期一" } ],

现在我想要这样的输出:

想要的输出: “工作时间”: { “开幕”:“”, “关闭”:“”, "dayName": "星期一" { "from_time": "06:13:16", "to_time": "04:14:11", “折扣”:“20”, "dayName": "星期一" }, { "from_time": "06:59:16", "to_time": "04:19:11", “折扣”:“20”, "dayName": "星期一" } }, 现在的输出: “工作时间”: [ { “开幕”:“09:30”, “关闭”:“13:30”, "dayName": "星期天" }, { “0”:{ "from_time": "06:13:16", "to_time": "04:14:11", “折扣”:“20”, "dayName": "星期一" }, “1”:{ "from_time": "06:59:16", "to_time": "04:19:11", “折扣”:“20”, "dayName": "星期一" }, “开幕”:“”, “关闭”:“”, "dayName": "星期一" }, { “0”:{ "from_time": "05:10:15", "to_time": "06:10:17", “折扣”:“20”, "dayName": "星期二" }, “开幕”:“”, “关闭”:“”, "dayName": "星期二" }, { “0”:{ "from_time": "13:00:00", "to_time": "14:50:00", “折扣”:“20”, "dayName": "星期三" }, "开幕": "10:30", “关闭”:“06:30”, "dayName": "星期三" }, { “开幕”:“01:00”, "收盘": "08:00", "dayName": "星期四" }, { “开幕”:“”, “关闭”:“”, “dayName”:“星期五” }, { “开幕”:“”, “关闭”:“”, “dayName”:“星期六” } ],

这是我的代码:

foreach ($returnDataAns['workingHours'] as $key => $value) { # 代码... foreach ($returnDataAns['discount'] as $key2 => $value2) { # 代码... if ($value['dayName'] == $value2['dayName']) { # 代码... array_push($returnDataAns['workingHours'][$key], $value2); } } }

知道我该怎么做吗?我只想删除那些 0:1: 键!

【问题讨论】:

  • 当你说不工作时,什么不工作?你有没有尝试过?
  • 您好,欢迎来到 SO。我建议您花一点时间来查看tour 并阅读How to Ask 页面。本网站有一些规则,以帮助提高内容质量,以便更轻松地回答问题。在您的情况下,您应该在问题本身中包含您尝试解决/搜索问题的解决方案,因为要求为您编写代码的问题在网站上被认为是题外话。祝你好运!
  • 实际上,我为两个数组做了一个foreach循环,然后比较它的dayName值,如果匹配则将第二个数组的值推入第一个。
  • 问题已编辑。
  • 我现在看到你的编辑了。您要删除 0 和 1 键吗?应该用什么来代替 0 和 1?这就是数组的工作原理。

标签: php html arrays json loops


【解决方案1】:

这将为您提供所需的输出...

$arr1 = json_decode('[
        {
            "opening": "09:30",
            "closing": "13:30",
            "dayName": "sunday"
        },
        {
            "opening": "",
            "closing": "",
            "dayName": "monday"
        },
        {
            "opening": "",
            "closing": "",
            "dayName": "tuesday"
        },
        {
            "opening": "10:30",
            "closing": "06:30",
            "dayName": "wednesday"
        },
        {
            "opening": "01:00",
            "closing": "08:00",
            "dayName": "thursday"
        },
        {
            "opening": "",
            "closing": "",
            "dayName": "friday"
        },
        {
            "opening": "",
            "closing": "",
            "dayName": "saturday"
        }
    ]', true);

$arr2 = json_decode('[
        {
            "from_time": "13:00:00",
            "to_time": "14:50:00",
            "discount": "20",
            "dayName": "wednesday"
        },
        {
            "from_time": "06:13:16",
            "to_time": "04:14:11",
            "discount": "20",
            "dayName": "monday"
        },
        {
            "from_time": "05:10:15",
            "to_time": "06:10:17",
            "discount": "20",
            "dayName": "tuesday"
        },
        {
            "from_time": "06:59:16",
            "to_time": "04:19:11",
            "discount": "20",
            "dayName": "monday"
        }
    ]', true);

$finalArray = [];
foreach ($arr1 as $key => $day) {
    $subArray = [];
    foreach ($arr2 as $key2 => $dayData) {
        if ($day['dayName'] === $dayData['dayName']) {
            $subArray[] = $dayData;
        }
    }
    $finalArray[$key] = !empty($subArray) ? $finalArray[$key] = [$day, $subArray] : [$day];
}

echo '<pre>';
echo '$finalArray ' . print_r($finalArray, true);
echo '</pre>';
echo '<pre>';
echo '$finalArray json_encoded ' . print_r(json_encode($finalArray), true);
echo '</pre>';
exit;

这将为您提供来自json_encode 输出的以下 JSON 字符串:

[  
   [  
      {  
         "opening":"09:30",
         "closing":"13:30",
         "dayName":"sunday"
      }
   ],
   [  
      {  
         "opening":"",
         "closing":"",
         "dayName":"monday"
      },
      [  
         {  
            "from_time":"06:13:16",
            "to_time":"04:14:11",
            "discount":"20",
            "dayName":"monday"
         },
         {  
            "from_time":"06:59:16",
            "to_time":"04:19:11",
            "discount":"20",
            "dayName":"monday"
         }
      ]
   ],
   [  
      {  
         "opening":"",
         "closing":"",
         "dayName":"tuesday"
      },
      [  
         {  
            "from_time":"05:10:15",
            "to_time":"06:10:17",
            "discount":"20",
            "dayName":"tuesday"
         }
      ]
   ],
   [  
      {  
         "opening":"10:30",
         "closing":"06:30",
         "dayName":"wednesday"
      },
      [  
         {  
            "from_time":"13:00:00",
            "to_time":"14:50:00",
            "discount":"20",
            "dayName":"wednesday"
         }
      ]
   ],
   [  
      {  
         "opening":"01:00",
         "closing":"08:00",
         "dayName":"thursday"
      }
   ],
   [  
      {  
         "opening":"",
         "closing":"",
         "dayName":"friday"
      }
   ],
   [  
      {  
         "opening":"",
         "closing":"",
         "dayName":"saturday"
      }
   ]
]

【讨论】:

  • 它提供与我的代码相同的输出,但留下了密钥,我只想删除这些密钥,你知道吗?
  • @JimKasprowicz 是的,我明白你现在需要什么 - 已经更新了我的答案:)
  • @JimKasprowicz 也更新了美化的json_encode 输出供您检查
  • @JimKasprowicz 我看到你接受了我的回答然后不接受......有什么理由吗?我已经给了你所要求的对吗?
  • 啊!很高兴你现在排序:)
【解决方案2】:

我认为这会给你预期的输出。
我使用 array_combine 和 array_column 使第一个数组关联。
必须循环第二个数组以创建一个可以与第一个数组合并的数组。

最后我使用 array_values 来删除关联。

foreach($discount as $val){
    $discount2[$val['dayName']][] = $val;
}  

$res = array_values(array_merge_recursive(array_combine(array_column($WH, "dayName"), $WH), $discount2));

var_dump($res);

https://3v4l.org/Q2fqe

【讨论】:

  • 我看到了您提供的链接。但即使在页面中,关联数组也有键,例如 [0]=> 和 [1]=>。我不想要它,我只想要它没有那个键。
  • 这是不可能的,正如我在 cmets 中对您的问题所写的那样,这就是数组的工作方式。这也是关联的反面,它是索引的。
  • 是的,我的错误,索引而不是关联。但是谢谢你的代码。我对此表示赞赏。
  • 如果您必须删除它们,您可以使用正则表达式将其删除。见“前后”:3v4l.org/4BWvt
  • @Jim 你为什么要删除属于数组标准的内容?有什么区别?当你对没有 0 和 1 的字符串进行 json_decode 时,PHP 无论如何都会创建它们。
猜你喜欢
  • 2017-04-21
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多