PHP Switch и добавление контента в одну переменную - PullRequest
1 голос
/ 27 июля 2011

Я использую эту функцию:

function makeImmunities($data) {
    $immunities = explode(',', $data);
    foreach($immunities as $immunity) {
        switch($immunity) {
            case 'poison':
                $ret .= '<img src="/images/gems/earth.gif"/> ';
            break;
            case 'earth':
                $ret .= '<img src="/images/gems/earth.gif"/> ';
            break;
            case 'paralyze':
                $ret .= '<img src="/images/gems/paralyze.gif"/> ';
            break;
            case 'death':
                $ret .= '<img src="/images/gems/death.gif"/> ';
            break;
            case 'ice':
                $ret .= '<img src="/images/gems/ice.gif"/> ';
            break;
            case 'invisible':
                $ret .= '<img src="/images/gems/invisible.gif"/> ';
            break;
        }
    }
    return $ret;
}

И $ ret имеет. =, Поэтому контент должен быть добавлен к себе. Но это не так. Я не хочу, чтобы это работало так:

$ data имеет массив, который выглядит следующим образом: «яд», «земля», «смерть». И эта функция возвращает только первый случай:

$ret .= '<img src="/images/gems/earth.gif"/> ';

Мне бы тоже не хотелось добавлять ВСЕ содержимое, которое имеет $ ret, если case совпадает с $ иммунитетом.

Ответы [ 7 ]

2 голосов
/ 27 июля 2011

Переключатель не работает так, что вам нужно использовать if и сделать что-то вроде этого:

$options = array(
    'poison' => '<img src="/images/gems/earth.gif"/> ',
    'earth'  => '<img src="/images/gems/earth.gif"/> '
    'etc'    => '...'
);

if(isset($options[$immunity])){
    $ret .= $options[$immunity];
}
1 голос
/ 27 июля 2011

Самый расширяемый и простой из всех, что я могу найти (без цикла if или даже цикла)

function makeImmunities($data) {

   $allImmunities = array(
     'poison' => '/images/gems/earth.gif',
     'earth' => '/images/gems/earth.gif',
     'paralyze' => '/images/gems/paralyze.gif',
     'death' => '/images/gems/death.gif',
     'ice' => '/images/gems/ice.gif',
     'invisible' => '/images/gems/invisible.gif',
   );

   $immunities = array_intersect_key($allImmunities, array_flip(explode(',', str_replace(' ','',$data))));

   return implode(' ', array_map(function(&$item, $key) {
      return "<img src=\"{$item}\" alt=\"{$key}\" />";
   }, $immunities, array_keys($immunities)));
}

Exemple:

var_export(makeImmunities('ice,poison,death'));

выход

'<img src="/images/gems/earth.gif" alt="poison" /> <img src="/images/gems/death.gif" alt="death" /> <img src="/images/gems/ice.gif" alt="ice" />'
1 голос
/ 27 июля 2011

Просто сделайте это так:

$immunities = explode(',', $data);
foreach($imminities as $key => $value) {
    $ret .= "<img src='/images/gems/{$value}.gif" />";
}
return $ret;

Тебе придется проверить иммунитет. Вы можете легко добавить условие if внутрь foreach, что-то вроде

if($value == "earth" || $value == "water" ....)

Довольно простой способ сделать это.

Обновление Как предполагает Коул, часть внутри условия if может быть заменена на in_array($value, $immunities_supported). Я не знаю об эффективности этого все же. Помните, что вы также должны добавить $immunities_supported = array("earth", "water"); и т.д. с имеющимися иммунитетами. (Код, приведенный ниже Коулом, не работает напрямую, это всего лишь концепция, поскольку $ value всегда в $ иммунитетах)

1 голос
/ 27 июля 2011

Вы писали, что $data содержит массив, но из кода ясно, что он должен содержать строку, например $data='earth,ice,poison';. Обратите внимание, что не должно быть места. Кстати, хорошо бы инициализировать (с пустой строкой) переменную $ret перед foreach.

0 голосов
/ 27 июля 2011
function makeImmunities($data) {

$ret = ""; //initialise $ret

$immunities = explode(',', $data);  
foreach($immunities as $immunity) {

    switch($immunity) {
        case 'poison':
            $ret .= '<img src="/images/gems/earth.gif"/> ';
        break;
        case 'earth':
            $ret .= '<img src="/images/gems/earth.gif"/> ';
        break;
        case 'paralyze':
            $ret .= '<img src="/images/gems/paralyze.gif"/> ';
        break;
        case 'death':
            $ret .= '<img src="/images/gems/death.gif"/> ';
        break;
        case 'ice':
            $ret .= '<img src="/images/gems/ice.gif"/> ';
        break;
        case 'invisible':
            $ret .= '<img src="/images/gems/invisible.gif"/> ';
        break;
    }

    $match[$immunity] = $ret; 
}
return $match;

}

0 голосов
/ 27 июля 2011

функция makeImmunities ($ data) {

$ret = ""; //initialise $ret

$immunities = explode(',', $data);

foreach($immunities as $immunity) {

    switch($immunity) {
        case 'poison':
            $ret .= '<img src="/images/gems/earth.gif"/> ';
        break;
        case 'earth':
            $ret .= '<img src="/images/gems/earth.gif"/> ';
        break;
        case 'paralyze':
            $ret .= '<img src="/images/gems/paralyze.gif"/> ';
        break;
        case 'death':
            $ret .= '<img src="/images/gems/death.gif"/> ';
        break;
        case 'ice':
            $ret .= '<img src="/images/gems/ice.gif"/> ';
        break;
        case 'invisible':
            $ret .= '<img src="/images/gems/invisible.gif"/> ';
        break;
    }
    /*
     * creates an array $match with key = immunity of match found e.g poison, death, earth
     * and values equal to <img src="/images/gems/xxxxxx.gif"/> where xxxxxx is the 
     * value for each corresponding image tag. 
     */
    $match[$immunity] = $ret; 
}
return $match;

}

$ input = 'яд, земля, смерть';

$ ans = makeImmunities ($ input); // возвращает массив

print_r ($ анс); // печатает массив

?>

0 голосов
/ 27 июля 2011

Во-первых, вам нужно инициализировать переменную "$ ret", добавить "$ ret = '';" перед циклом "foreach". Используйте if и elseif.

...