合并2个不同长度的php数组

时间:2010-04-04 11:38:29

标签: php arrays merge

打扰一下,如果以前确实曾经问过这个问题,我看不到任何符合我需要的东西,而是出现在那里几十个类似的帖子中;)

我正在尝试合并两个长度不同的php数组,并将它们合并到一个存在于相同key =>的值上。两个数组中的值。

我的第一个查询从嵌套集生成一个数组:

array
(
    1 => array
    (
'node_id' => 1,
    'lft' => 1,
    'rgt' => 4,
    'moved' => 0,
    'label' => 'Home',
    'entry_id' => 1,
    'template_path' => '',
    'custom_url' => '/',
    'extra' => '',
    'childs' => 1,
    'level' => 0,
    'lower' => 0,
    'upper' => 0
    ),
    2 => array
    (
'node_id' => 2,
    'lft' => 2,
    'rgt' => 3,
    'moved' => 0,
    'label' => 'Home',
    'entry_id' => NULL,
    'template_path' => '',
    'custom_url' => 'http://google.com/',
    'extra' => '',
    'childs' => 0,
    'level' => 1,
    'lower' => 0,
    'upper' => 0
    )
);

我的第二个数组返回了一些我想插入上面数组的其他键/值:

array
(
'entry_id' => 1,
'entry_title' => 'This is my title',
);

我希望将附加信息的两个数组合并到关键字'entry_id'上的数组中,以及保持不匹配的子数组。

所以,通过组合这两个数组,我最终得到了

array
(
    1 => array
    (
'node_id' => 1,
    'lft' => 1,
    'rgt' => 4,
    'moved' => 0,
    'label' => 'Home',
    'entry_id' => 1,
    'template_path' => '',
    'custom_url' => '/',
    'extra' => '',
    'childs' => 1,
    'level' => 0,
    'lower' => 0,
    'upper' => 0,
    'entry_title' => 'This is my title'
    ),
    2 => array
    (
'node_id' => 2,
    'lft' => 2,
    'rgt' => 3,
    'moved' => 0,
    'label' => 'Home',
    'entry_id' => NULL,
    'template_path' => '',
    'custom_url' => 'http://google.com/',
    'extra' => '',
    'childs' => 0,
    'level' => 1,
    'lower' => 0,
    'upper' => 0,
    'entry_title' => NULL
    )
);

实际上,写出来让我觉得我应该通过sql ...

来做

更新: 我正在尝试更新查询,但收到错误,我无法弄清楚如何修复连接:(

SELECT `n`.*, round((`n`.`rgt` - `n`.`lft` - 1) / 2, 0) AS childs, 
count(*) - 1 + (`n`.`lft` > 1) + 1 AS level, 
((min(`p`.`rgt`) - `n`.`rgt` - (`n`.`lft` > 1)) / 2) > 0 AS lower, 
(((`n`.`lft` - max(`p`.`lft`) > 1))) AS upper 
FROM `exp_node_tree_6` `n`, `exp_node_tree_6` `p` 
LEFT JOIN `exp_channel_titles` ON (`exp_node_tree_6.entry_id`=`exp_channel_titles.entry_id`) 
WHERE `n`.`lft` 
BETWEEN `p`.`lft` 
AND `p`.`rgt` 
AND ( `p`.`node_id` != `n`.`node_id` OR `n`.`lft` = 1 ) 
GROUP BY `n`.`node_id` 
ORDER BY `n`.`lft`

抱歉,我对sql很新...即使我确实做到了这一点,这不仅会返回那些在两个表上都有entry_id匹配的东西吗?

我需要从exp_node_tree_6表中获取所有数据,并且如果entry_id存在,则能够进入另一个...

1 个答案:

答案 0 :(得分:0)

就像在查询级别更容易做到。执行此操作的SQL将类似于:

SELECT * FROM my_main_table
    LEFT JOIN my_entry_table ON (my_main_table.entry_id = my_entry_table.entry_id)

否则,如果你真的,真的想要使用PHP,那么你想做的事情就是:

$modified_rows = array();
foreach ($first_rows as $row) {
    if (!is_null($row['entry_id']) && $row['entry_id'] == $second_array['entry_id']) {
        # merge/add colums from second array
        $modified_rows []= array_merge($row, $second_array);
    } else {
        # don't modify the original array
        $modified_rows []= $row;
    }
}

其中$first_rows是您提到的未经修改的第一个多维数组,$second_array是第二个。