Проблема с переменной областью с операторами if (PHP)

Хорошо, у меня, похоже, есть неправильное представление с переменной областью с PHP, простите мою нехватку предмета, поскольку я исхожу из фона Java, С#. Думая, что я могу сделать переменные доступными для функций или если заявления просто, поместив их за пределы. Ниже приведен фрагмент того, что я пытаюсь выполнить:

foreach ($nm as $row=>$im) {
    $itm_name = $im;
    $lnk = $lnk_cty[$row];  
    if($mode == 'addMenu') {
        $m = $m_id; //id will be coming from fresh insert of menu_name 
    } else {
        $m = $_POST['mnu_add'][$row];
        echo "MENU_ID: ".$m;
    }
    if($mode == 'addCat') {
        $m = $c_id; //id will be coming from fresh insert of cat_name
    } else {
 $m = $_POST['cat_add'][$row];
    }
    //used for testing purposes
    echo "item name: ".$itm_name ."<br />";
    echo "lnk: ".$lnk ."<br />";
    echo "m: ".$m ."<br />"; //$m is empty here, because its a new declaration as oppose to accessing $m value from if statement
    $display_fields .= "<li>".$itm_name." ".$item."</li>";
    $sql_array[] = '("' . $itm_name . '", "' . $lnk . '",  ' . $m . ')';  // Add a new entry to the queue 
}

Теперь то, что я пытаюсь сделать, это сделать значения переменной $m доступными вне операторов if, входящих в переменную $m, используемую в инструкции $sql_array[]. В С# я просто объявляю переменную вне цикла foreach и могу ее использовать. После некоторого чтения по этому вопросу я обнаружил, что использование ключевых слов global или GLOBALS будет работать только в том случае, если моя глобальная переменная сферы присваивает значение перед foreach и объявляет global $m для получения этого значения в цикле. Но с моим текущим кодом $m имеет локальную область действия внутри операторов if, и все не рекомендуют использовать их. Итак, есть ли лучший способ сделать $m доступным для оператора $sql_array[]?

Ответ 1

If Блоки операторов не имеют собственной области. Независимо от того, какие данные вы присваиваете $m, с самого начала должно быть пустым. Попробуйте отладить такие вещи, как переменные $_POST. Кроме того, где определено $m_id? Возможно, он тоже пуст.

PHP имеет область видимости внутри функций, методов класса и т.п. Но операторы If не имеют собственных возможностей. Например, следующий код будет эхом Hi there!:

$bool = true;
if ($bool) {
    $new_var = 'Hi there!';
}
echo $new_var;

Прочитайте в manual.

Ответ 2

здесь переменная $id_struct не установлена, что мне делать?

if(!$struct_req) {
                mysql_query("insert into structure values (null, 3,'".$_POST["structure"]."')") or die("insert structure : ". mysql_error());
                if(isset($id_struct)) echo "isset <br>";
                $id_struct = mysql_insert_id();
}else {
                //global $id_struct;
                $id_struct = mysql_fetch_array($struct_req)["id_structure"];

}
echo $id_struct;

Ответ 3

Справедливо, что если в операторах нет области видимости, но кажется, что существует проблема с областью (фрагмент кода в фигурных скобках).. в приведенном ниже фрагменте кода ожидаемый результат: $z [0] = 0, $z [1] = 1, но полученный фактический результат равен $z [0] = 100; и $z [1] - undefined. Используемый PHP используется для распространения друзей Apache

<?php

$x = 0;
$y = 1;
$z[0]=100;

if($x!=0){
    $z[0]=1;
    $z[1]=2;
    $z[2]=3;
    $z[3]=4;
}else{
    if($y == 0){
        $a =1;
    }else{
        global $z;
        echo $z[0];
        echo $z[1];
    }
}

?>