В PHP я могу получить общее количество операторов case в операторе switch? - PullRequest
3 голосов
/ 28 апреля 2009

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

$id = $_GET['id'];

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

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

echo $data;

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

Ответы [ 7 ]

7 голосов
/ 28 апреля 2009

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

$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()

1 голос
/ 28 апреля 2009

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

1 голос
/ 28 апреля 2009

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

1 голос
/ 28 апреля 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;
    }
}

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

1 голос
/ 28 апреля 2009

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

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

find -name '*php' | xargs grep 'case'
0 голосов
/ 28 апреля 2009

На самом деле этот код будет работать:

$i = 0;
switch(something)
{
    case "item".$i++: //something
        break;
    case "item".$i++: //something
        break;
    default: //something
        break;
}
0 голосов
/ 28 апреля 2009

ОК, допустим, URL выглядит следующим образом:

somesite.com / Ajax / getinfo.php? ID = новости

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

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

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

}

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

...