工作中,发现老大利用str_replace做函数判断的方法很鸡血,一开始看代码的时候没整明白,后来问老大才知道他的做法是间接使用str_replace做数组判断。附上一段代码:
if (empty($gift["buylimit"]) == false)
{
$contain_str = explode(",",$gift["buylimit"]);
if (empty($rep_goods_name))
{
$sql = "SELECT group_concat(goods_name) FROM ".$ecs->table('cart'). " WHERE session_id = '".SESS_ID."' AND is_gift=0 AND parent_id=0 ";
$rep_goods_name = $db->getOne($sql);
}
//在数组$contain_str查找,是否含有$rep_goods_name商品名字,如果有替换成|*-*|
$contrast_name = str_replace($contain_str,'|*-*|',$rep_goods_name);
//如果在数组替换成功,下面的条件不成立
if ($contrast_name == $rep_goods_name)
{
$result["error"] = 1;
$result["message"] = $_LANG['favourable_not_available'];
die($json->encode($result));
}
}
乍一看到$contrast_name = str_replace($contain_str,'|*-*|',$rep_goods_name);这一行没有注释完全不明白,后来才弄明白。一开始以为这种做法效率会比较高,后来XHProf测试运行效率并不是这样的。
完全可以用array_search代替这种小技巧。改良后的代码如下:
if (empty($gift["buylimit"]) == false)
{
$contain_str = explode(",",$gift["buylimit"]);
if (empty($rep_goods_name))
{
$sql = "SELECT group_concat(goods_name) FROM ".$ecs->table('cart'). " WHERE session_id = '".SESS_ID."' AND is_gift=0 AND parent_id=0 ";
$rep_goods_name = $db->getOne($sql);
}
//这样可读性更好,效率更高
if (array_search($rep_goods_name, $contain_str) ===false )
{
$result["error"] = 1;
$result["message"] = $_LANG['favourable_not_available'];
die($json->encode($result));
}
}
使用XHProf测试运行时间如下图,str_replace用了10毫秒,array_search用了5毫秒,速度更快