PHP合并含重复键的数组:解决array_combine去重问题
解决PHP中带重复键的数组合并问题
嘿,这个问题我之前也踩过坑!首先得明确一个核心点:PHP的关联数组不支持重复键——你给出的期望输出在实际运行中是不可能存在的,因为当你尝试给同一个键赋值两次时,后面的值会直接覆盖前面的,最终cuti bersama只会保留最后一个日期2018-2-13。
不过我们可以通过两种方式来满足你「保留所有键值对应关系」的需求,看你更倾向哪种:
方案1:把重复键的对应值合并成数组
如果希望同一个标题下能关联所有对应的日期,可以手动遍历两个数组,把相同标题的值存到一个子数组里:
$title = array('new year', 'cuti bersama', 'cuti bersama'); $date = array('2018-1-1', '2018-1-10', '2018-2-13'); $title_date = []; foreach ($title as $index => $key) { // 如果键不存在,先初始化一个空数组 if (!isset($title_date[$key])) { $title_date[$key] = []; } // 把对应的日期追加到子数组里 $title_date[$key][] = $date[$index]; } print_r($title_date);
运行后输出的结果是:
Array ( [new year] => Array ( [0] => 2018-1-1 ) [cuti bersama] => Array ( [0] => 2018-1-10 [1] => 2018-2-13 ) )
方案2:用索引数组存储独立的键值对
如果你不想把值合并成数组,而是想保留每一组「标题-日期」的独立关系,可以用索引数组来存储每个键值组合:
$title = array('new year', 'cuti bersama', 'cuti bersama'); $date = array('2018-1-1', '2018-1-10', '2018-2-13'); $title_date = []; foreach ($title as $index => $key) { $title_date[] = [ 'title' => $key, 'date' => $date[$index] ]; } print_r($title_date);
输出结果如下:
Array ( [0] => Array ( [title] => new year [date] => 2018-1-1 ) [1] => Array ( [title] => cuti bersama [date] => 2018-1-10 ) [2] => Array ( [title] => cuti bersama [date] => 2018-2-13 ) )
为什么array_combine会丢数据?
最后说下原因:array_combine的逻辑是用第一个数组的元素当键,第二个数组的对应元素当值,但PHP要求数组的键必须唯一,所以遇到重复键时,后面的值会直接覆盖前面的,这就是你只看到一个cuti bersama的原因。
内容的提问来源于stack exchange,提问作者Andhika R.K.
相关产品推荐
相关产品推荐

