php 将二维数组中的列值指定为第一级键[重复]

mepcadol  于 2023-04-19  发布在  PHP
关注(0)|答案(2)|浏览(111)

此问题已在此处有答案

Generate an associative array from an array of rows using one column as keys and another column as values(3个答案)
昨天关门了。
假设我有下面的数组

[
        {
            "id": "16",
            "name": "dog",
        },
        {
            "id": "17",
            "name": "cat",
        },
        {
            "id": "18",
            "name": "mouse",
        }
]

我想使用一个特定的属性id作为数组的键。我可以这样做:

$someArray = [
    ["id" => "16", "name" => "dog"],
    ["id" => "17", "name" => "cat"],
    ["id" => "18", "name" => "mouse"]
];

$newArray = [];
foreach ($someArray as $currItem)
{
    $newArray[$currItem["id"]] = $currItem;
}

那我就有了这个(想要的结果)

{
    "16": {
        "id": "16",
        "name": "dog"
    },
    "17": {
        "id": "17",
        "name": "cat"
    },
    "18": {
        "id": "18",
        "name": "mouse"
    }
}

我的问题是:有没有更好的方法来做到这一点?我真的必须循环遍历每一项,只是为了稍微重新定义我的数组吗?

pwuypxnk

pwuypxnk1#

你比我先找到答案,但我可能会贡献一点...
我不确定你的原始数组是从哪里来的,但是如果你正在解码JSON,那么你可以提供第二个参数来强制对象转换为关联数组

$contents = trim(file_get_contents("/home/jaith/foo/foo.json"));
$arr = json_decode($contents, TRUE); // note the second parameter
$v = array_combine(array_column($arr, "id"), $arr); 
var_dump($v);

编辑:如果你可以容忍你的输出数组有对象,这也可能起作用:

$contents = trim(file_get_contents("/home/jaith/foo/foo.json"));
$arr = json_decode($contents);
$v = array_combine(
        array_column(
                array_map(
                        function($item) { return (array)$item; },
                        $arr 
                ),
                "id"
        ),
        $arr
);
var_dump($v);

但是要记住,对于非常非常大的数组,性能可能会成为一个问题。

eh57zj3b

eh57zj3b2#

我似乎已经找到了一个解决方案,使用信息从Rizier123的答案对另一个问题。
据我所知,array_column()只会给予我一个id数组,所以我需要将它与array_combine()array_values()一起使用。

$someArray = [
    ["id" => "16", "name" => "a"],
    ["id" => "17", "name" => "b"],
    ["id" => "18", "name" => "c"]
];

$newArray =  array_combine(array_column($someArray, "id"), $someArray);

相关问题