如何使用PHP中的isset重新编写in_数组?

如何使用PHP中的isset重新编写in_数组?,php,optimization,Php,Optimization,我有以下代码: return in_array( get_theme_mod( 'header_style' ), ['style-1','style-2','style-3','style-4', 'style-6'] ); 它应该返回标题_style(可以是style-1、style-2等)是否精确地位于该列表中 简单地说,它是: in_array( 'style-1', ['style-1','style-2','style-3','style-4', 'style-6'] ); 如何

我有以下代码:

return in_array( get_theme_mod( 'header_style' ), ['style-1','style-2','style-3','style-4', 'style-6'] );
它应该返回
标题_style
(可以是
style-1、style-2等)是否精确地位于该列表中

简单地说,它是:

in_array( 'style-1', ['style-1','style-2','style-3','style-4', 'style-6'] );

如何使用isset重新写入此内容?

isset
检查是否设置了密钥的值,因此您需要重建第二个数组,如下所示(仅举一个示例):

现在,您可以使用
isset

$allowed_styles = ['style-1' => true, 'style-2' => true, 'style-3' => true, 'style-4' => true, 'style-6' => true];
// option is:
// $allowed_styles = array_fill_keys(['style-1', 'style-2'], true);

return isset($allowed_styles[get_theme_mod( 'header_style' )]);
如中所述,isset实际上比_数组更快。in_数组是O(n),而isset是O(1)

使用isset的一种方法是将数组重写为以下形式:

$array = ['style-1' => true, 'style-2' => true, 'style-3' => true, 'style-4' => true, 'style-6' => true];
如果只搜索一次数组,这是最好的方法。但是,如果您不喜欢该方法的冗长,并且计划多次检查某个元素的存在,则可以这样做:

$array = ['style-1', 'style-2', 'style-3','style-4', 'style-6'];
$array = array_flip($array);
这将反转键和值,因此
$array['style-1']
将为0,
$array['style-2']
将为1,依此类推。然后,您可以使用isset或array\u key\u exists:

return array_key_exists( get_theme_mod( 'header_style' ), $array );

我听说从PHP7开始,array_key_exists在这方面比isset快,但我实际上没有看过任何基准测试。

好的,我要咬一口:为什么要用“isset”重写它?isset检查数组键的存在,而不是值。因此,您必须重写数组以使用值作为键(使用伪值),这没有多大意义。@KIKOSoftware超出了回答这个问题的范围,但我有很多这样的函数,我在其中检查这些值,我担心当我添加更多值(数百)时,它将开始成为一只猪。可能是@CBroe的复制品。它不是复制品。这个问题是关于哪个更快;这个问题是关于如何实际利用isset在大多数情况下更快的知识。PHP有处理这种精确场景的工具(例如,数组翻转)。
return array_key_exists( get_theme_mod( 'header_style' ), $array );