如何将一个数组转换为键值对数组?

3

我有一个数组:

array(
    0 => array("name", "address", "city"), 
    1=> array( "anoop", "palasis", "Indore"),
    2=> array( "ravinder", "annapurna", "Indore")
)

我希望以这种方式创建数组:

array( 
    0 =>  array("name" = >"anoop" , "address" = >"palasia", "city" = >"Indore"),
    1 =>  array("name" = >"ravinder" , "address" = >"annapurna", "city" = >"Indore")
)

请在您的问题中指明是否要将第一个元素中的项用作键。 - The Nail
我想把那个数组转换成键值对...请帮帮我。 - Ravinder Singh
5个回答

9
现代的方法是:
$data = array_column($data, 'value', 'key');

在您的情况下:
$data = array_column($data, 1, 0);

4
使用array_combine函数。如果$array包含您的数据。
$result = array(
             array_combine($array[0], $array[1]),
             array_combine($array[0], $array[2])
          );

总的来说
$result = array();
$len = count($array);
for($i=1;$i<$len; $i++){
    $result[] = array_combine($array[0], $array[$i]);
}

2
如果您的数据在$array中:
$res = array();
foreach ($array as $key=>$value) {
    if ($key == 0) {
        continue;
    }
    for ($i = 0; $i < count($array[0]); $i++) {
        $res[$array[0][$i]] = $value[$i];
    }
}

现在的结果存储在$res中。


在执行内部的 for 循环以及外部的 foreach 循环的每一次迭代中都调用 count() 方法,这会导致性能下降。 - user212218
@Phoenix 这里的效率根本不重要吗?你是认真的吗? - Borealid
1
这是一个不好的实践。原帖中呈现的数组有两行需要处理,但此处发布可能已经截断了该数组;它实际上可能包含数千条记录。或者有人在解决类似问题时看到此答案并养成了不良习惯。 - user212218
2
@Phoenix 不是的,它在计算第一行的长度。第一行只有五个元素,永远不会是“成千上万”的。过早优化是万恶之源。 - Borealid
1
在“for”循环中使用“count”是一种众所周知的不良实践,它很容易引起负面评价。我曾经点了个踩,但后来又取消了。 :( - Shiplu Mokaddim
@Borealid 这是一个公正的观点。然而,我仍然坚持我的-1。除非在非常特殊的情况下,否则没有好的理由这样做。 - user212218

1

这里有一个你可以使用的函数:

function rewrap(Array $input){
    $key_names = array_shift($input);
    $output = Array();
    foreach($input as $index => $inner_array){
        $output[] = array_combine($key_names,$inner_array);
    }
    return $output;
}

这里是一个演示:

// Include the function from above here 
$start = array(
    0 => array("name", "address", "city"),
    1 => array("anoop", "palasis", "Indore"),
    2 => array("ravinder", "annapurna", "Indore")
);
print_r(rewrap($start));

这将输出:

Array
(
    [0] => Array
        (
            [name] => anoop
            [address] => palasis
            [city] => Indore
        )

    [1] => Array
        (
            [name] => ravinder
            [address] => annapurna
            [city] => Indore
        )

)

注意:您的第一个数组定义索引1两次,因此我将第二个更改为2,如下所示:

array(0 => array("name", "address", "city"), 1 => array("anoop", "palasis", "Indore"),2 => array("ravinder", "annapurna", "Indore"))

那可能只是一个打字错误。


0

无论是关闭投票还是评论,都不能作为答案。should-we-flag-answers-that-only-contain-a-link-to-another-so-answer - Shiplu Mokaddim
谢谢,我已经阅读了讨论。然而,我不同意,并认为将链接到一个问题中,该问题涉及到一个概念——关联数组,这个概念在OP之前没有提到,会增加一些价值。 - The Nail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接