Мои команды PHP foreach действуют только на последний элемент массива! - PullRequest
1 голос
/ 16 апреля 2011

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

$countryinp = trim($_POST['country']);
$countryinp = explode("\n", $countryinp);
$countryinp = array_filter($countryinp, 'trim');
foreach($countryinp as $code)
{
$country = '';
if( $code == 'Afghanistan' ) $country = 'AF';
if( $code == 'Aland Islands' ) $country = 'AX';
if( $code == 'Albania' ) $country = 'AL';
if( $code == 'Algeria' ) $country = 'DZ';
...
if( $country == '') $country = $code;
echo "$country";
echo "<br />";
unset($code);
}

Код будет зацикливаться и выводить список всех входов, но он только устанавливает $country в двухбуквенный код для последней строки ввода!Я схожу с ума, кто-нибудь видел это раньше?

Ответы [ 3 ]

1 голос
/ 16 апреля 2011

Попробуйте что-то вроде этого ...

foreach($countryinp as $code)
{
$code = trim($code);
    switch($code){
        case "Afganistan": $country = "AF"; break;
        case "Alanad Islands": $country = "AX"; break;
        default: $country = $code;
    }

    echo $country."<br />";
}

И убедитесь, что ваши данные существуют ...

0 голосов
/ 16 апреля 2011

С этим фрагментом кода вы можете столкнуться с множеством логических проблем.

foreach($countryinp as $code) // #1
{
$country = ''; // #2
if( $code == 'Afghanistan' ) $country = 'AF'; // #3
if( $code == 'Aland Islands' ) $country = 'AX';
if( $code == 'Albania' ) $country = 'AL';
if( $code == 'Algeria' ) $country = 'DZ';
...
if( $country == '') $country = $code; #4
echo "$country";
echo "<br />";
unset($code); // #5
}
  1. $ Код - это переменная, видимая в области видимости foreach, которой назначается значение next ($ countryinp) (указатель наследующий элемент в массиве)

  2. $ страна сбрасывается в '' (пустое значение) на каждой итерации (вы сбрасываете значение $ страны)

  3. $ code == 'xxxx' - здесь вы можете использовать оператор switch (), два преимущества: 1) выражение оценивается только один раз, а затем сопоставляется с 'case' и 2) ремонтопригодность (если вам нужно что-то изменить в вашем коде ..)Лучшим решением было бы просто иметь массив с именем страны в качестве ключа и кодом страны в качестве значения, тогда вы можете получить прямой доступ к коду страны, например: $ countryCodes [$ countryName];

  4. ЗдесьВы присваиваете текущий $ код страны для $ страны, только если $ страна пуста, но, как указано в # 2, вы сбрасываете значение $ страны на каждой итерации

  5. Здесь вы сбрасываете значение $ codeи это не обязательно, $ code виден только внутри foreach () и автоматически сбрасывается, когда ваш код существует в цикле foreach.

Надеюсь, это поможет.:)

0 голосов
/ 16 апреля 2011

Какая проблема у вас точно?Вы говорите, что он устанавливает $country для двухбуквенного кода последней строки, но печатает ли он все коды до этого?

Это должно быть очевидно, но если у вас возникают проблемы только со значением $country после завершения цикла, то вы должны понимать, что переменная $country перезаписывается на каждой итерации цикла,и поэтому будет содержать значение только из последней итерации, когда цикл завершится.

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

Одна из возможных проблем с данными, которые могут у вас возникнуть, это строка:

$countryinp = array_filter($countryinp, 'trim');

Я думаю, что ваше намерениес помощью этой строки нужно применить функцию trim к каждому элементу в массиве, но это не то, что делает array_filter.Функция array_filter состоит в том, чтобы передать каждый элемент в массиве функции обратного вызова.Эта функция проверяет содержимое элемента, а затем возвращает true, если содержимое следует сохранить, или false, если этот элемент должен быть отфильтрован из массива.

Когда вы передаете trim в array_filter, единственное, что происходит, это то, что любой элемент массива, который пуст или содержит только пробел, будет удален.Это потому, что после обрезки таких элементов они пусты.PHP интерпретирует пустую строку как false и удаляет ее из массива.

Это может вызвать проблемы с вашими операторами if, потому что, если $code содержит, например, «Афганистан» (обратите внимание на завершающий символ)пробел), тогда оператор if не поймает его, так как строки не будут совпадать.

Было бы намного лучше, если бы просто запустить строку $code = trim($code); в начале вашего foreach loop.

Кроме того, ваш код немного уродлив для меня.Если вы просто собираетесь проверять одну и ту же переменную снова и снова (то есть повторять операторы if ($code == 'Value')), тогда вам действительно следует использовать вместо этого оператор switch:

switch ($code) {
    case "Afghanistan":
        $country = 'AF';
        break;
    case "Aland Islands":
        $country ='AX';
        break;
    // repeat for other cases
    default:
        $country = $code;
}
...