Какую функцию PHP Array я должен использовать? - PullRequest
2 голосов
/ 29 июня 2011

У меня есть два массива:

Array
(
[0] => Array
    (
        [id] => 1
        [type] => field
        [remote_name] => Title
        [my_name] => title
        [default_value] => http%3A%2F%2Ftest.com
    )

[1] => Array
    (
        [id] => 2
        [type] => field
        [remote_name] => BookType
        [my_name] => book-type
        [default_value] => 
    )

[2] => Array
    (
        [id] => 3
        [type] => value
        [remote_name] => dvd-disc
        [my_name] => dvd
        [default_value] => 
    )
)


Array
(
[title] => Test
[book-type] => dvd
)

Мне нужно взять каждый ключ во втором массиве, сопоставить его со значением my_name в первом массиве и заменить его соответствующим значением remote_nameпервого массива при сохранении значения второго массива.

Должна быть какая-то функция c array zy, чтобы помочь!

РЕДАКТИРОВАТЬ: В некоторых случаяхvalue второго массива необходимо будет заменить на value первого массива remote_name, где значение второго массива совпадает со значением my_name первого массива.Как мне этого добиться?

EG: book-type => dvd должно превратиться в BookType => dvd-disc

Ответы [ 3 ]

2 голосов
/ 29 июня 2011

Как так?:

$first = array(
    array(
        'id' => 1,
        'type' => 'field',
        'remote_name' => 'Title',
        'my_name' => 'title',
        'default_value' => 'http%3A%2F%2Ftest.com',
    ),
    array(
        'id' => 2,
        'type' => 'field',
        'remote_name' => 'BookType',
        'my_name' => 'book-type',
        'default_value' => '',
    ),
    array(
        'id' => 3,
        'type' => 'value',
        'remote_name' => 'dvd-disc',
        'my_name' => 'dvd',
        'default_value' => '',
    ),
);

$second = array(
    'title' => 'Test',
    'book-type' => 'dvd',
);

$map = array('fields' => array(), 'values' => array());
foreach ($first as $entry) {
    switch ($entry['type']) {
        case 'field':
            $map['fields'][$entry['my_name']] = $entry['remote_name'];
            break;

        case 'value':
            $map['values'][$entry['my_name']] = $entry['remote_name'];
            break;
    }
}

$new = array();
foreach ($second as $key => $val) {
    $new[isset($map['fields'][$key]) ? $map['fields'][$key] : $key] = isset($map['values'][$val]) ? $map['values'][$val] : $val;
}

print_r($new);

выход

Array
(
    [Title] => Test
    [BookType] => dvd-disc
)

Объяснение

Первый цикл собирает пары my_name / remote_name для полей и значений и делает их более доступными. Вот так:

Array
(
    [fields] => Array
        (
            [title] => Title
            [book-type] => BookType
        )

    [values] => Array
        (
            [dvd] => dvd-disc
        )

)

Второй цикл будет проходить через $second и использовать пары ключ / значение, чтобы заполнить $new. Но при этом проверит наличие дубликатов ключ / значение в $map.

Используются ключи или значения, не найденные на карте как .

0 голосов
/ 29 июня 2011

Мне неизвестна такая функция c array zy, но я знаю, как вы могли бы это сделать:

//$array1 is first array, $array2 is second array

foreach($array1 as $key => $value){
    if (isset($value['remote_name'], $value['my_name']) && $value['remote_name'] && $value['my_name']){
        $my_name = $value['my_name'];
        if (isset($array2[$my_name])) {
            $remote_name = $value['remote_name'];
            $array2[$remote_name] = $array2[$my_name];
            //cleanup
            unset($array2[$my_name]);
        }
    }
}
0 голосов
/ 29 июня 2011
foreach($arr1 as &$el) {
    $el['remote_name'] = $arr2[$el['my_name']];
}
unset($el);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...