2012-11-26 60 views
0

我有一段代碼,我只是寫,檢測是否有登錄和用戶,如果[1] [2]有串在任何特定的文本,然後將遷至該人向另一人頁面是否符合值。簡化PHP如果公司和數組

但我認爲我的代碼是一個小長篇大論。有什麼方法可以簡化我擁有的或者我會得到的最好的?

if (!isset($_SESSION['user_id'])){ 
    $dir = dirname($_SERVER['PHP_SELF']); 
    $dirs = explode('/', $dir); 
    if(isset($dirs[1])){ 
     if (($dirs[1] == "account") || ($dirs[1] == "admin")){ 
      header('Location: /'); 
     } 
    } 
    if(isset($dirs[2])){ 
     if(($dirs[2] == "account")){ 
      header('Location: /'); 
     } 
    } 
} 

在此先感謝

+1

也許你可以使用mod_rewrite併爲這些路徑指定重寫規則? –

+0

已修改代碼,該代碼片段在if語句中以檢查用戶是否已登錄 – ngplayground

回答

2

一個簡單的方法是使用封閉

$dir = explode('/', dirname($_SERVER['PHP_SELF'])); 

$is = function($pos, $check) use($dir) { 
    return array_key_exists($pos, $dir) && $dir[$pos] == $check; 
}; 

if($is->__invoke(1, 'account') 
    || $is->__invoke(1, 'admin') 
    || $is->__invoke(2, 'account')) { 
    header('Location: /'); 
} 
1

你能做到這一點,例如:

$dir = dirname($_SERVER['PHP_SELF']); 
$dirs = explode('/', $dir); 

if(in_array('account',$dirs) || in_array('admin', $dirs)){ 
    header('Location: /'); 
} 
+1

,現在是Bgi&James的組合:'if(in_array(array('account','admin'),$ dirs) )header('Location:/');' –

+0

我用一個回聲代替標題來測試頁面響應。它什麼都不返回。 – ngplayground

+0

的如果以檢查$顯示目錄被正確創建 – Bgi

0

其中幾個簡單的解決方案可能是使用PHP的array_intersect($array1, $array2)函數。這是有據可查的php.net website,但這裏有一個小例子:

// Define all the 'search' needles 
$needles = array('account', 'admin'); 

// Get all the dirs 
$dirs = explode('/', dirname($_SERVER['PHP_SELF'])); 

// Check for needles in the hay 
if(array_intersect($needles, $dirs)) 
{  
    // Redirect 
    header('Location: /');  
} 

新增:當然,你可以通過多條線路組合成一個作出上述非常簡單,這將留給你:

if(array_intersect(array('account', 'admin'), explode('/', dirname($_SERVER['PHP_SELF'])))) 
{ 
    header('Location: /'); 
} 
+0

我用一個回聲替換頭來測試頁面響應。它什麼都不返回。 – ngplayground

+0

該網站的網址是什麼?如果你的URL類似於site.com/index.php,它將只返回一個數組項:'/',但是如果URL是site.com/admin/index.php,你會得到兩個:'/' &'admin' – James

+0

好的,我已經做了一些進一步的研究,並發現了另一個比較兩個數組更可靠的PHP函數array_intersect()。我會更新我的帖子來改用它。 – James