在PHP中将列表(数组)转换为关联数组

3
我可以帮您将以下 PHP 列表 (数组) 转换为其他格式:
array("start", "end", "coords")

将值为真的键值对转换为关联数组(仅为了能够快速测试键的存在/缺失),即类似于以下内容:
array(
    "start" => 1,
    "end" => 1,
    "coords" => 1
)

有没有更优雅的方法来完成这个任务?
array_fill_keys($ar, 1)

10
还有什么比调用内置函数更优美的呢? - Felix Kling
有没有像array_fill_keys这样的函数? - sandeep
@sandeep:http://php.net/manual/zh/function.array-fill-keys.php - Felix Kling
如果元素数量相对较小,线性搜索大致相当于分配哈希并查找它,因此如果是这种情况,您不需要添加额外的复杂性。 - cgwyllie
@cgwyllie,是的,但是“快速”也指代码的优雅性 - 因此,我不必编写array_search("coords", $ar) !== false,而只需编写$ar["coords"]即可。 - Tomas
显示剩余4条评论
2个回答

5

array_fill_keys($ar, 1)可能是最优雅的解决方案了。


1

有一个名为array_flip的函数可以实现这个功能。

http://php.net/array_flip

对于数组,使用array_flip再加上isset的方式比使用in_array更快。

但要注意,只有当你需要多次搜索数组时才有用。


无论如何,与 isset 相比,in_array 都很慢,因为它必须执行线性搜索。array_flip 是一种可能性,但请注意,第一个条目的值将为 0,因此不会评估为 true(例如 if($arr[firstEntry]))。当然,无论如何都应该使用 isset,所以实际值并不重要(只要它们不是 null)。 - Felix Kling
1
@Tomas:你有没有其他测试元素存在的方法?只使用 if($arr[value]) 如果键不在数组中,会产生一个 Notice: - Felix Kling
是的,in_array 很慢。但如果我使用这种方法来检查一个值是否存在于数组中,它必须处理数组中的每个项。而且我确信将字符串哈希并将其作为数组键所需的时间比判断是否等于 $needle 的时间更长。此外,这种方法占用更多的内存 - 但如果您正在检查许多字符串,则非常好用。 - skyronic
@Thomas,那么只需说 $result[$originalArray[0]] = 1,现在您可以确信每个键都指向一个评估为“true”的值。 - skyronic

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