如何使用PHP中的isset重写in_array?

时间:2018-07-11 10:28:50

标签: php optimization

我有此代码:

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

应该准确返回header_style(可能为style-1, style-2, etc.)在该列表中。

简单来说,是:

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

如何用isset重写它?

2 个答案:

答案 0 :(得分:1)

isset检查是否设置了键的值,因此您需要重建第二个数组,作为一个例子:

// `style-` become keys
['style-1' => true, 'style-2' => true, 'style-3' => true, 'style-4' => true, 'style-6' => true];

现在,您可以使用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' )]);

答案 1 :(得分:0)

正如another question中所述,isset实际上比in_array快。 in_array为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_key_exists:

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

我听说有传言说,从PHP7开始,array_key_exists的速度比isset快,但实际上我还没有看过任何基准测试。