объединить 2 php массива, которые не имеют одинаковую длину по значению - PullRequest
0 голосов
/ 04 апреля 2010

Извините, если раньше об этом действительно спрашивали, я не смог увидеть ничего из того, что соответствовало бы моим потребностям, из десятков аналогичных титулованных постов;)

Я пытаюсь объединить 2 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 ...

UPDATE: Я пытаюсь обновить запрос, но получаю ошибки, которые я не могу понять, как исправить в соединении: (

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 голосов
/ 04 апреля 2010

Это делает , как это было бы легче сделать на уровне запроса. 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 - второй.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...