iT邦幫忙

0

這段 php 有簡化的空間嗎?

$nowSelf = $_SERVER['PHP_SELF'];
if(
$nowSelf=='/admin/product-add.php' or
  $nowSelf=='/admin/blog-add.php' or
  $nowSelf=='/admin/blog.php' && $_GET['query']=='edit' or
  $nowSelf=='/admin/product.php' && $_GET['query']=='edit' or
  $nowSelf=='/admin/store.php' && $_GET['query']=='edit' or
  $nowSelf=='/admin/store.php' && $_GET['query']=='add' or
  $nowSelf=='/admin/theme.php' && $_GET['query']=='edit' or
  $nowSelf=='/admin/theme.php' && $_GET['query']=='add' or
  $nowSelf=='/admin/blog-type.php' && $_GET['query']=='edit' or
  $nowSelf=='/admin/blog-type.php' && $_GET['query']=='add' or
  $nowSelf=='/admin/blog-sub-type.php' && $_GET['query']=='edit' or
  $nowSelf=='/admin/blog-sub-type.php' && $_GET['query']=='add')
  {
  //....
  }

這有辦法簡化嗎?
我想過用 switch,但發現還有 GET['query'] 條件呢.....
於是我卡了

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
3
最佳解答

這樣一個if就解決了…

$nowSelf = $_SERVER['PHP_SELF'];
$action = empty($_GET['query']) ? 'fileAry' : $_GET['query'].'FileAry';
$addFileAry = ['/admin/store.php', '/admin/theme.php', '/admin/blog-type.php', '/admin/blog-sub-type.php'];
$editFileAry = ['/admin/blog.php', '/admin/product.php'];
$editFileAry = array_merge($editFileAry, $addFileAry);
$fileAry = ['/admin/product-add.php', '/admin/blog-add.php'];
if(in_array($nowSelf, ${$action})){

}
柯柯 iT邦新手 3 級 ‧ 2018-08-17 10:47:17 檢舉

/images/emoticon/emoticon32.gif

啥? 還有得學…
/images/emoticon/emoticon10.gif

火爆浪子 iT邦研究生 1 級 ‧ 2018-08-17 14:50:10 檢舉

神之解法

1
柯柯
iT邦新手 3 級 ‧ 2018-08-17 09:06:54

	switch ($nowSelf) {
		case '/admin/product-add.php':
  		case '/admin/blog-add.php':
            # code...
  			break;
  		case '/admin/blog.php': 
  		case '/admin/product.php': 
  			if($_GET['query']=='edit'){
                # code...
            }
  			break;
		case '/admin/store.php':
		case '/admin/theme.php':
		case '/admin/blog-type.php':
		case '/admin/blog-sub-type.php':
            if($_GET['query']=='add' || $_GET['query']=='edit'){
                # code...
            }
			break;
		default:
			# code...
			break;
	}

這樣

2
炎之虛空
iT邦高手 3 級 ‧ 2018-08-17 09:18:01
$arr = ['product-add','blog-add','blog','product','store','theme','blog-type','blog-sub-type'];
        $path = pathinfo($nowSelf, PATHINFO_FILENAME);

        if (strpos($nowSelf, 'admin') && in_array($path, $arr)) {
            if (in_array($_GET['query'], ['add', 'edit'])) {

            } else {

            }
        }

青菜寫的
剩下自己debug

看更多先前的回應...收起先前的回應...

不推薦把.php拿掉的作法

把 PATHINFO_FILENAME
改成PATHINFO_BASENAME
array那邊優加.php就變成符合你推薦做法啦

這樣寫其實有個問題,之後有變動如增加別的action,判斷還是會變多,另外也不好分辨哪個頁面屬於哪個action,不過這行還是蠻不錯的,是我看錯…

pathinfo($nowSelf, PATHINFO_FILENAME)

其實我們只能解決他目前所提出的問題所印隊的方式
畢竟很多從頭到尾也不是很清楚他為何設計成這樣
話說回來
假如是我的話大概會直接 Explosion 處理XD....

0

我覺得,最大的重點並不是這支程式的簡化。而是為何要這樣寫??
其目的是為何?

由程式碼可以了解到的是,有可能還有add與edit的參數發送,再加上來源網址的安全驗証的問題。

讓我比較不解的地方是,為何add與edit會是同一個動作判斷式內。為何不能統一參數。
也就是從源頭找起並修正此問題。

要不然,其實程式的重點來看。因該是query參數來決定要add跟edit。
nowSelf 只是拿來做安全驗証處理。這樣程式碼就可以很容易的區分。

這段程式碼要簡寫的方式有太多了,但重點還是要先了解其目的。程式寫法百百種。
有時候不簡化也是為了日後的維護方便,並不一定需要簡化。
(不過我上面說的話,不適合用在你這段程式碼就是了,你這樣的程式碼是一定需要簡化的)

還是一樣愛打字丫…,通常看到這種的,都會直接打掉重練了
/images/emoticon/emoticon28.gif

應該是前人種的因
後人要處理這個陰

因為為陰。如真是這樣。那我也會偏向打掉重建還比較快。

5
q00153
iT邦新手 3 級 ‧ 2018-08-17 16:11:42

我也來學習一下 :)

<?php

$nowSelf = $_SERVER['PHP_SELF'];
$query   = empty($_GET['query'])? '0' : $_GET['query'];
$verification = [
	'/admin/product-add.php'   => ['0'    => TRUE,],
	'/admin/blog-add.php'      => ['0'    => TRUE,],
	'/admin/blog.php'          => ['edit' => TRUE,],
	'/admin/product.php'       => ['edit' => TRUE,],
	'/admin/store.php'         => ['edit' => TRUE, 'add' => TRUE,],
	'/admin/theme.php'         => ['edit' => TRUE, 'add' => TRUE,],
	'/admin/blog-type.php'     => ['edit' => TRUE, 'add' => TRUE,],
	'/admin/blog-sub-type.php' => ['edit' => TRUE, 'add' => TRUE,],
];

if (isset($verification[$nowSelf][$query])) {
	
}

不錯的解法,不過應該這樣就行了…

'/admin/store.php'  => ['edit', 'add'],
q00153 iT邦新手 3 級 ‧ 2018-08-20 12:47:08 檢舉

因為指定 edit 與 add 為值的話
沒有辦法只使用一次 isset() 判斷
必須要判斷兩次,使用 isset() 與 in_array() 之類的方式
所以才寫成這樣 @@~~

即使是兩次效能也差不到哪去,以這情況比起效能,更重要是簡潔更重要,每種情境有不同用法,在這點上的取捨要更精確,而且 isset() 應該能一次判斷吧?

我要發表回答

立即登入回答