如何将简单数组转换为关联数组?

38

如何在PHP中最快地将简单数组转换为关联数组,以便可以使用isset($array[$value])检查值?

即执行以下转换的最快方式:

$array = array(1, 2, 3, 4, 5);
$assoc = array();

foreach ($array as $i => $value) {
        $assoc[$value] = 1;
}

1
使用in_array($value, $array)代替isset($array[$value])。 - TarranJones
5个回答

42

你的代码与以下代码完全等价:

$assoc = array_fill_keys(array(1, 2, 3, 4, 5), 1); // or
$assoc = array_fill_keys(range(1, 5), 1);

array_flip()虽然可能适合你的用途,但并不相同。

PHP参考文献:array_fill_keys()array_flip()


我如何将其应用于二维数组?谢谢! - Dat TT
你是对的。正确的方法是使用array_fill_keys(),这应该是被选中的答案。 - wp student

21
如果有人仍然想知道如何做到这一点,可以使用array_combine函数来更轻松地解决。
$array = array(1, 2, 3, 4, 5);
$assoc = array_combine($array,$array);

2
如果两个键相同,这将无法工作! - Daniel Carrera
这个很棒!!只要确保你的“键数组”中每个键都是唯一的。此外,你可以直接在“值数组”的变量名上调用它。它会用新的关联数组替换它。 - José Rasmussen
请注意,如果性能很重要,array_combine 的速度较慢,请考虑使用 in_array。 - csandreas1

21

array_flip() 正是这样做的:

array_flip() 返回一个键值翻转后的数组,即来自 trans 的键变成值,来自 trans 的值变成键。

请注意,trans 的值需要是有效的键,即它们需要是整数字符串。如果一个值具有错误类型,则会发出警告,并且相关的键/值对不会被翻转

如果一个值有多个出现,则最新的键将用作其值,而其他所有值都将丢失。


但除此之外,在 PHP 中只有一种类型的数组。即使是数字(“简单”)数组也是关联数组。


array_flip可以做到...谢谢...但是isset(array[5])在普通数组中是没有被设置的,但是在关联数组中isset(assoc_array[5])是被设置了...因为值是键...但是在普通数组中,数组索引是键...我有什么遗漏吗? - user773755
@Rome:你在这里混淆了两件事情。每个数组都是关联的。当然,$array[5]没有被设置,因为键从04。你想要一个键从1到5(或者换句话说,你想把一个数组的值设为另一个数组的键)。但是,这两个数组仍然都是关联数组。$array的键只是从0开始的连续整数。 - Felix Kling
注意:在我有限的测试中,array_fill_keys 函数比 array_flip 函数更快。 - user773755

0

只需使用这个逻辑

$var1 = json_encode($arr1, JSON_FORCE_OBJECT);
$var1 = json_decode($var1);

$arr1是需要转换为关联数组的数组。 可以通过json_encode和json_decode来实现。


-1
function simple_to_associative($array) {
    $new_array = [];
    $i = 0;
    $last_elem = end($array);
    $nr_elems = count($array);
    foreach ($array as $index=>$value) {
        if($i % 2 == 0 && $last_elem == $value) {
            $new_array[$value] = '';
        } elseif($i % 2 == 0) {
            $new_array[$value] = $array[$index + 1];
        }
        $i++;
    }
    return $new_array;
}

适用于任何无限元素的简单数组。


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