2016-01-06 147 views
-1

for/foreach循環中的變量是否具有局部範圍?如果是這樣,我該如何使其成爲全球?PHP for; foreach變量範圍

page.php文件:

<?php 
$title = "2";     
$menu[0] = "1"; 
$menu[1] = "2"; 
$menu[2] = "3"; 
$menu[3] = "4"; 
$menu[4] = "5"; 
$menu[5] = "6"; 
$menu[6] = "7"; 
$menu[7] = "8"; 


foreach ($menu as $value){ 

if ($title == $value){ 
     $active = "active"; 
     echo "if " . $active. $title . $menu[$x] ." <br /><br />"; 
} 
else { 
    $active = ""; 
    echo "else " . $active. $title . $menu[$x] ." <br /><br />"; 
}} 

include "header.php"; 

foreach ($menu as $value) { 
var_dump($active); 
    echo "$value <br>"; 
} 


include "header.php"; 
?> 

<!-- begin page content --> 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
<!-- end page content --> 

<?php 
include "footer.php";     
?> 

從本質上講,我有這條線在header.php中:

<li class="mainNav <?php echo $active; ?>" style="z-index:8"> 
<a href="http://www.com"><?php echo $menu[0]; ?></a></li> 

我想要列表有類= 「mainNav活躍」,如果它是該頁面和class =「mainNav」如果不是。

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!

所以我從@urfusion建議創建一個功能。現在page.php文件:

<?php 
$title = "2";     
$menu[0] = "1"; 
$menu[1] = "2"; 
$menu[2] = "3"; 
$menu[3] = "4"; 
$menu[4] = "5"; 
$menu[5] = "6"; 
$menu[6] = "7"; 
$menu[7] = "8; 
?> 


<?php 


function mainNav($menu) { 


foreach ($menu as $value){ 

if ($title == $value){ 
     $active = "active"; 
     echo "if " . $active. $title . $menu[$x] . " <br /><br />"; 
    } 
    else { 
    $active = " "; 
    echo "else " . $active. $title . $menu[$x] . " <br /><br />"; 
    } 


echo "function" . $active . $value; 
    return $active; 

} 
} 


include "header.php"; 
?> 


<!-- begin page content --> 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
<!-- end page content --> 

<?php 
include "footer.php";     
?> 

而且header.php文件:

<li class="mainNav <?php mainNav(); ?>" style="z-index:8"> 
<a href="http://www.com"><?php echo $menu[1]; ?></a></li> 

還是什麼都沒有,現在我似乎失去了回波語句的輸出...

+1

在foreach循環之前初始化'$ active' – urfusion

+0

「for/foreach循環中的變量是否有本地作用域?」 - 循環,開關/案例,try-catch塊等不構成在PHP中的範圍。見https://3v4l.org/WjX5Q – VolkerK

+0

我不知道你在做什麼。第二個foreach完全拋棄我! –

回答

-1

你的代碼看起來像

$active = ""; 
foreach ($menu as $value){ 

    if ($title == $value){ 
     $active = "active"; 
     echo "if " . $active. $title . $menu[$x] ." <br /><br />"; 
    } 
    else { 
    $active = ""; 
    echo "else " . $active. $title . $menu[$x] ." <br /><br />"; 
    } 
} 

在PHP中,可以在腳本中的任何位置聲明變量。

一個變量的範圍是其中變量可以被引用/使用的腳本的一部分。

PHP有三種不同的變量範圍:

local 
global 
static 

在爲/ foreach循環有一個局部範圍上scope

+0

中使用像'using(...)'這樣的子句我得到了正確的echo語句,但它並沒有改變header.php。我想知道是否這是因爲foreach循環沒有包含在header.php文件中,或者如果它是其他東西... – testing123

+0

你不能在其他文件中使用變量而不通過任何'function'或'url'或會話變量。 – urfusion

+0

只有包含header.php(_循環之後)纔會保留已分配給$ active的最後一個值。在你的例子中,最後一個分配是在循環迭代中有'$ value == 8',因此'$ active ='''。 – VolkerK

2

做變量的更多信息?如果是這樣,我該如何使其成爲全球?

PHP中只有兩種作用域:全局作用域和局部作用域。

本地函數範圍包含了函數的參數和所設置的函數體中的變量。範圍是在調用函數時創建的,並且在函數執行完成後(或者在執行return語句之後,或者在最後一條語句後達到其關閉}時)被銷燬。

全球範圍包含由任何函數外的代碼設置的所有變量。它由主腳本(由解釋器調用的腳本)創建。

includedrequired文件不創建新的作用域。包含文件中功能以外的代碼在放置includerequire語句的範圍內運行。這意味着,如果include語句出現在包含include語句的函數的本地作用域的任何函數之外,則全局作用域。所有四項包括陳述(include,include_once,require,require_once)在這件事情上的工作是一樣的。

任何變量都在其範圍內可用,因爲它是第一次設置,直到它被刪除使用unset()或直到其範圍被銷燬。

查看更多about variables scopePHP documentation


要回答你的問題:如果forforeach環被放置在一個函數,那麼它們定義具有局部範圍(功能範圍)的變量;否則它們具有全球範圍。


在你的代碼的問題(壞的壓痕不幫你看到它)是在第一foreach

這是正確地縮進的代碼:

foreach ($menu as $value) { 
    if ($title == $value) { 
     $active = "active"; 
     echo "if " . $active. $title . $menu[$x] ." <br /><br />"; 
    } else { 
     $active = ""; 
     echo "else " . $active. $title . $menu[$x] ." <br /><br />"; 
    } 
} 

的問題是很明顯的:它修改在每個迭代變量$active的值。除$active的最後一項作業外,其他作業都沒用。只有最後一個重要。最有可能的是,在最後一次迭代中,需要if ($title == $value)$activeelse分支變爲''(空字符串)。

這個問題有幾種簡單的解決方案。例如,您可以顯示菜單上述foreach內:

foreach ($menu as $value) { 
    if ($title == $value) { 
     $active = "active"; 
    } else { 
     $active = ""; 
    } 
    ?> 
    <li class="mainNav <?php echo $active; ?>" style="z-index:8"> 
    <a href="http://www.com"><?php echo $value; ?></a></li> 
    <?php 
} 

事實上,所有這些東西應該進入header.php