Como ya te mencione en otro post, hablar de eficiencia es discutir quien fue primero, si el huevo o el gallo
Ineficiente dices porque recorre el array, pero al hacer if... elseif... elseif... igual estamos evaluando condiciones una y otra vez. Por otro lado, no veo cuál es el problema en usar break; para romper el ciclo o continue; para saltar un loop. Además, usando un foreach el código se vuelve más flexible, pues para agregar buscadores sólo hace falta agregar el patrón al array. Incluso, en algún caso, podría usarse una base de datos para extraer los patrones y buscar. Es eficiente cuando uno mismo afirma que lo es.
Ahora, claro que se puede usar switch. Como te darás cuenta en el siguiente código, hay pequeños trucos que buscan explotar al máximo las cualidades de php
Código php:
Ver originalfunction parse_referal() {
// Le modifiqué esta línea para probar
# $referer = $_SERVER['HTTP_REFERER'];
$referer = 'http://search.msn.com/results.aspx?q=okram&FORM=MSNTST';
$pattern = array ('google' => '/&q=([0-9a-zA-Z.\+%]{1,})/', 'yahoo' => '/\?p=([0-9a-zA-Z.\+%]{1,})/',
'msn' => '/\?q=([0-9a-zA-Z.\+%]{1,})/' );
$matches = array(); // vacio
switch(true):
case strstr($referer,'yahoo.'): preg_match($pattern['yahoo'], $referer, $matches); break;
break;
case strstr($referer,'google.'): preg_match($pattern['google'], $referer, $matches); break;
default:
return false;
break;
endswitch;
return ($matches[1]);
}
Por último, como también ya te lo dije en otro mensaje, debes hacer el código lo más "readable" posible. Quiero decir, de fácil lectura. Para ello un poco de orden estaría bien. El servidor no te reclamará nada si ve tu código en más o menos líneas. Hay
un artículo... dale una ojeada