2015-11-07 3 views
2

Рассмотрим:Могу ли я использовать strpos в корпусе коммутатора?

У меня есть переменная $field, что время от времени может быть, среди прочих, такие ценности, как action, id и another_term. Я хочу использовать switch структуры просеять значение:

switch ($field) { 
    case 'action': 
     // do something 
     break; 
    case 'id': 
     // do something 
     break; 
    case (strpos($field, '_term')): 
     // do something else 
     break; 
} 

Первые два случая работу. Третье - нет. Я думаю, что это неправильное использование оператора switch. Это лучше обрабатывается как последовательность if/else?

ответ

2

Вы можете сделать это с помощью switch заявление так:

$field = 'bla bla_term bla'; 

switch (true) { 
    case $field === 'action': 
     echo 'action'; 
    break; 
    case $field === 'id': 
     echo 'id'; 
    break; 
    case strpos($field, '_term') >= 0: 
     echo '_term'; 
    break; 
} 

switch оператор просто сравнивает выражения в каждом case блок в значение в скобках switch.

Выражения являются единицами кода, которые можно уменьшить до значения, например 2 + 3 или strpos(...). В PHP большинство вещей - это выражения.

Вот аннотированный вариант приведенного выше примера:

// We are going to compare each case against 
// the 'true' value 
switch (true) { 

    // This expression returns true if $field 
    // equals 'action' 
    case $field === 'action': 
     echo 'action'; 
    break; 

    // This expression returns true if $field 
    // equals 'id' 
    case $field === 'id': 
     echo 'id'; 
    break; 

    // This expression returns true if the 
    // return value of strpos is >= 0 
    case strpos($field, '_term') >= 0: 
     echo '_term'; 
    break; 
} 

Если вы хотите использовать возвращаемое значение strpos вызова, то вы можете просто присвоить его (присвоения выражений в PHP):

case ($pos = strpos($field, '_term')) >= 0: 
    echo '_term at position ' . $pos; 
break; 
+0

Спасибо - это именно то, что я пытаюсь сделать. –

+0

Для других, хотя это решение удовлетворяет мои потребности, 'another_terminator_movie' также верно в третьем случае. Если вам нужно быть явным, что '_term' является последней частью тестируемой строки, тогда либо что-то вроде ответа MiDri здесь, либо один из этих [http://stackoverflow.com/a/4764912/1389927] может быть больше подходящее. –

1

switch - это всего лишь вид if x == y, где y - любой из соответствующих случаев.

case (strpos($field, '_term')) приведет к -1, если совпадение не найдено или точка, где найдено «_term» (от 0 до длины строки -1), а не имя поля.

Если вы хотите, чтобы поймать что-нибудь там с фразой «_term» в поле у ​​

$matches = array(); 
if(preg_match('/(.+)_term$/', $field, $matches)) { 
    $field = $matches[1]; 
} 

это будет заменить значение поля «address_term» или что-либо «something_term» просто «адрес» или «что-то»

+0

Да, вы правы. Strpos возвращает позицию или -1, а не строку, поэтому случай никогда не будет соответствовать. Хорошо, я переосмыслию, что использовать вместо strpos. –

+0

Я обновил свой ответ тем, что, я думаю, вы хотите сделать, но я не уверен. Вы можете сделать обратное так же, как и сделать «/.+(_term)$/» в качестве выражения, и оно превратит все, что заканчивается на «_term», просто «_term», чтобы вы могли использовать регистр оператора «_term»: – MiDri

+0

да - Спасибо. –

Смежные вопросы