将数组键更改为数组中的值

时间:2019-02-14 12:18:53

标签: php

编辑:

尝试避免在看到的$data数组之外进行循环。我需要做几次,所以看起来很乱。


我有一个与此类似的数组:

$links = [
    [
        'type_id' => '1',
        'url' => ''
    ],
    [
        'type_id' => '2',
        'url' => ''
    ]
];
$types = [
    [
        'id' => 1,
        'value' => 'facebook'
    ],
    [
        'id' => 2
        'value' => 'twitter'
    ]
];
$data = [
    'primary' => [
        'address_details' => [],
        'contact_details' => [],
        'social_links' => $links
    ]
];

我需要$data['primary']['social_links']中的键才能使用$type['value'],而不仅仅是0、1等。

所以$data看起来像:

$data = [
    'primary' => [
        'address_details' => [],
        'contact_details' => [],
        'social_links' => [
            'facebook' => [
                'type_id' => '1',
                'url' => ''
            ],
            'twitter' => [
                'type_id' => '2',
                'url' => ''
            ]
        ]
    ]
];

是否可以使用array_map之类的方法执行此操作?

4 个答案:

答案 0 :(得分:3)

一个简单的for循环可以做到:

https://3v4l.org/h47MG

<?php

$links = [
    [
        'type_id' => '1',
        'url' => ''
    ],
    [
        'type_id' => '2',
        'url' => ''
    ]
];
$types = [
    [
        'value' => 'facebook'
    ],
    [
        'value' => 'twitter'
    ]
];
$result = [];
for($i = 0, $len = count($types); $i < $len; $i++) {
    $result[$types[$i]['value']] = $links[$i];
}
$data = [
    'primary' => [
        'address_details' => [],
        'contact_details' => [],
        'social_links' => $result
    ]
];

var_dump($data);

答案 1 :(得分:3)

您可以使用循环直接修改数组:

for($i=0; $i < sizeof($links); $i++) {
    $links[$types[$i]['value']] = $links[$i];
    unset($links[$i]);
}

var_dump($links);

输出:

["facebook"]=> array(2) { 
    ["type_id"]=> string(1) "1" 
    ["url"]=> string(0) "" 
} 
["twitter"]=> array(2) { 
    ["type_id"]=> string(1) "2" 
    ["url"]=> string(0) "" 
}

或者,如果您不想循环,请使用array_combine,根据您对另一个答案的评论:

array_combine(array_column($types, 'value'), $links)

答案 2 :(得分:3)

您可以仅将array_combinevalue的{​​{1}}列的输出(使用array_column生成)用作键并使用$types中的值:

$links

输出:

$data = [
    'primary' => [
        'address_details' => [],
        'contact_details' => [],
        'social_links' => array_combine(array_column($types, 'value'), $links)
    ]
];
print_r($data);

Demo on 3v4l.org

更新

基于对OP的编辑问题,提供一站式解决方案变得更加复杂。这应该起作用:

Array ( 
    [primary] => Array (
        [address_details] => Array ( )
        [contact_details] => Array ( )
        [social_links] => Array (
            [facebook] => Array (
                [type_id] => 1
                [url] =>
            )
            [twitter] => Array (
                [type_id] => 2
                [url] =>
            )
        )
    ) 
)

Demo on 3v4l.org

答案 3 :(得分:0)

<pre><code>
$social_links = [];
foreach ($types as $type):
    $social_links[$type['value']] = $links[$key];
endforeach;

$data = [
    'primary' => [
        'address_details' => [],
        'contact_details' => [],
        'social_links' => $social_links
    ]
];

print_r($data);
</code></pre>