Помогите объединить 2 многомерных массива в php - PullRequest
1 голос
/ 08 апреля 2011

Я долгое время читал здесь и никогда не писал, но мне было интересно, может ли кто-нибудь помочь мне с проблемой, с которой я столкнулся ...

У меня есть 2 массива, которые печатаются так:

$fields = Array
(
    [0] => Array
        (
            [field] => NewField
            [label] => New Field
            [required] => 1
        )

    [1] => Array
        (
            [field] => _Field2
            [label] => Field 2
            [required] => 0
        )

)



$fields_data = Array
(
    [0] => Array
        (
            [field_id] => 1
            [field_name] => New Field
            [db_name] => NewField
            [field_type] => text
        )

    [1] => Array
        (
            [field_id] => 6
            [field_name] => Field 2
            [db_name] => _Field2
            [field_type] => text
        )

)

И мне нужно создать массив, который выглядит следующим образом:

$new_arr = Array
(
    [NewField] => Array
        (
            [field_id] => 1
            [field_name] => New Field
            [field_type] => text
            [label] => New Field
            [required] => 1
        )

    [_Field2] => Array
        (
            [field_id] => 6
            [field_name] => Field 2
            [field_type] => text
            [label] => Field 2
            [required] => 0
        )

)

Итак, db_name становится ключами массива, а затем массив 2, где поле совпадает с db_name, объединяется в один массив.

Вот код, с которым я пытался работать, но, очевидно, по какой-то причине он не работает (PHP не моя сильная сторона):

foreach($fields as $field){

    $new_arr[$field['field']] = array();

foreach($fields_data as $tkey => $tval) {


if($fields_data[$tkey]['db_name'] = $fields['field']) {

$new_arr[$field['field']]['field_id'] = $fields_data[$tkey]['field_id'];

    }
    }

    }

Очевидно, что приведенный выше код будет создавать только элемент field_id в массиве, однако он не работает. Я думаю, что наличие 2 циклов перезаписывает значение field_id каждый раз. Но, как я сказал, php не является моей сильной стороной, поэтому любая помощь по этому вопросу будет высоко оценена.

Спасибо

Ответы [ 3 ]

1 голос
/ 08 апреля 2011

Предполагая, что вы объединяете 2 массива с равенством меток в первом массиве и field_name во втором (но у меня есть некоторые сомнения, поскольку у вас есть оба в массиве результатов), вот правильный способ сделать это.

$newArray = array();
//create a map for o1 complexity
$fieldDataMap = array();
foreach($fields_data as $data){
    $fieldDataMap[$data['field_name']] = $data;
}
//walk over fields to fill newArray
foreach($fields as $field){
    $newArray[$field['field']] = array(
        'field_id' => $fieldDataMap[$field['label']]['field_id'],
        'field_name' => $fieldDataMap[$field['label']]['field_name'],
        'field_type' => $fieldDataMap[$field['label']]['field_type'],
        'label' => $field['label'],
        'required' => $field['required']
    );
}
print_r($newArray);

edit: это решение кажется немного излишним только для 2-х записей, но когда дело доходит до массивов размером 100+, это принесет больше пользы со сложностью o1.

0 голосов
/ 08 апреля 2011

Этот код возьмет два заданных вами массива и превратит их в третий.Надеюсь, поможет!Возможно, можно использовать некоторые настройки, но, надеюсь, это решит вашу проблему.

$new_arr = array();
foreach( $fields as $field )
{
    foreach( $fields_data as $field_data )
    {
        if( $field['field'] == $field_data['db_name'] )
        {
            $new_arr[ $field['field'] ] = array_merge( $field, $field_data );
            unset( $new_arr[$field['field']]['field'], $new_arr[$field['field']]['db_name'] );
        }
    }
}
0 голосов
/ 08 апреля 2011

Предполагая, что оба массива имеют одинаковую длину и элементы упорядочены:

$newArr = array();
for($i = 0; $i <= count($fields); $i++) {
    $idx = $fields[$i]['field'];
    $newArr[$idx] = array_merge($fields[$i], $fields_data[$i];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...