Могу ли я получить общее количество операторов case в операторе switch в PHP?

Есть ли способ вернуть общее количество экземпляров (case) в операторе switch? Что-то вроде этого:

$id = $_GET['id'];

switch ($id) {
  case "item1" :
  $data = 'something1';
  break;

  case "item2" :
  $data = 'something2';
  break;
}

echo $data;

Но причина в том, что есть несколько файлов с этими операторами switch, но их количество зависит от файла. В идеале я хотел бы иметь возможность перебирать эти операторы switch, увеличивая «id». Есть идеи, возможно ли это?


person Community    schedule 27.04.2009    source источник
comment
Я действительно не понимаю, что вы пытаетесь сделать. Может быть, если вы объясните проблему, которую пытаетесь решить, мы сможем с этим помочь. Решение подсчета операторов case кажется не лучшим подходом.   -  person Chad Birch    schedule 28.04.2009
comment
Я тоже, но мне кажется, что есть лучшее решение для того, чем вы хотите заниматься.   -  person Moutaz    schedule 28.04.2009
comment
Я просто пытаюсь не переписывать чужой код, который обычно делает то, что мы хотим :) Я в основном создаю индекс всех разделов сайта для поисковой системы, не связанной с базами данных. Человек, создавший сайт, использовал jquery для загрузки частей данных из некоторых операторов switch. Jquery загрузит URL-адрес файла php с переменной идентификатора, переданной в его URL-адрес, который переключатель / case вернет соответствующие соответствующие данные. Поскольку базы данных нет, я решил перебрать переключатели и сравнить строку, и тогда она могла бы вернуть нужную. Вот вкратце ... лучшие идеи?   -  person    schedule 28.04.2009


Ответы (7)


Если вы просто присваиваете значения на основе другого значения, вы можете использовать массив вместо этого:

$idToData = array(
    'item1' => 'something1',
    'item2' => 'something2',
);
$data = 'default';
if (isset($_GET['id']) && array_key_exists($_GET['id'], $idToData)) {
    $data = $idToData[$_GET['id']];
}
echo $data;

Преимущество массива в том, что он может быть расширенный, а количество элементов можно подсчитать с помощью count()

person Gumbo    schedule 27.04.2009
comment
Я как раз писал это, +1. Если все, что здесь есть, - это корреляция $ id / $ data, массив звучит как правильный инструмент для работы. - person zombat; 28.04.2009

Не обошлось без изменения значения $ id и удаления операторов break ... но такого рода цели не достигаются. Есть ли причина, по которой вам нужно знать, сколько?

Я бы просто grep файлы, о которых вы хотите узнать

find -name '*php' | xargs grep 'case'
person Louis    schedule 27.04.2009

А ... Думаю, я понимаю, что тебе нужно. Что вы могли бы сделать, так это добавить default: case, который завершает цикл, вместо того, чтобы пытаться подсчитать. Например.

for($id = 1; !$quit; $id++)
{
    switch("item" . $id) {
    case "item1":
         // Do something
         break;
    case "item<n>":
         // Do something else
         break;
    default:
         $quit = true;
    }
}

Вопрос: почему бы просто не сделать все это без операторов цикла и case, просто ... поместив один оператор за другим?

person Jason Musgrove    schedule 27.04.2009
comment
Я согласен, я думаю, что это был тот ответ, который он искал, но я не совсем понимаю, как это поможет со всеми другими файлами XD. Я думаю, он мог бы зацикливать вызов функции для каждого файла, увеличивая идентификатор. Затем он мог бы просто проверить условие возврата по умолчанию или null, если его нет. - person Louis; 28.04.2009

Вероятно, вы сможете сделать то, о чем просите, с помощью token_get_all (), но, скорее всего, это не лучшее решение вашей реальной проблемы.

person Frank Farmer    schedule 28.04.2009

На самом деле вы можете сделать это надежно, используя token_get_all (). Вот пример использования этой функции, чтобы найти все варианты использования define () в файле PHP. Вам нужно будет построить конечный автомат (аналогичный связанному) для поиска операторов switch, а затем подчиненных операторов case. Вы можете захотеть или не захотеть убедиться, что правильно работаете с вложенными операторами switch.

person cletus    schedule 28.04.2009

Хорошо, допустим, URL-адрес выглядит так:

somesite.com/ajax/getinfo.php?id=news

Затем вы можете взять значение $ _GET [id] и обработать его с помощью переключателя.

Если бы я правильно представил ваш код:

$section=$_GET[id];
switch($section) {
case "1":
break;
.
.
.
default:

}

Если это не так, прошу прощения за мой английский. Пожалуйста, объясните это немного подробнее, это все еще немного двусмысленно.

person Moutaz    schedule 28.04.2009

Собственно такой код и будет работать:

$i = 0;
switch(something)
{
    case "item".$i++: //something
        break;
    case "item".$i++: //something
        break;
    default: //something
        break;
}
person KdgDev    schedule 28.04.2009