2010-03-01 8 views
3

내 웹 사이트에서 URL 재 작성을 사용하려고하는데 올바른 콘텐츠를 얻으려면 list()explode() 함수를 사용하고 싶습니다. 이 경우 $url에서리스트 및 폭발

list($dir, $act) = explode('/',$url); 

이 잘 작동 것, 즉 http://example.com/random/stuff => $url = random/stuff/ 절대 URL에서 첫 번째 슬래시 후 모두 동일하지만, 내가 http://example.com/random/로 이동하려면 다음 인쇄됩니다 현재 내 코드는 다음과 같습니다 페이지에 대한 고지. 통지가 나타나지 않게하려면 어떻게해야합니까? list() 기능 이외의 것을 사용해야합니까? 도움을

감사

오른쪽 이제 통지 ": 정의되지 않은 오프셋 1 ...주의"입니다!

+3

이 문제를 해결하기 위해 프로덕션 사이트에서 PHP 오류 표시를 해제해야합니다. – Matthew

답변

8

당신은 URL이 포함 얼마나 많은 패스 세그먼트 (segment)를 확인해야합니다.

+0

보다 유연한 접근 방식의 예가 무엇입니까? – cskwrd

+0

@ TheGNUGuy : 귀하의 요구 사항, 응용 프로그램이 인수를 기대하는 방식에 따라 다릅니다. – Gumbo

+0

switch 문을 사용하기 위해 위의 솔루션을 적용하여 여러 다른 사례를보다 쉽게 ​​처리 할 수 ​​있습니다. 감사! – cskwrd

1

해결 방법은 변수의 존재하지 않는 값을 결코 할당하지 못하도록 코드 라인을 여러 개 분할하는 것입니다. 이는 explode이 URL의 한 부분 만 반환 할 때 수행중인 작업입니다. list를 사용하지 않을 것을 들어

,이 상황에서, 목록과 함께, 당신이 ... 얼마나 많은 요소를
를 반환합니다 =의 오른쪽에있는 표현을 알고 있어야합니다,로, 최적의 솔루션처럼 보인다 그리고 돈 얼마나 많은 요소가 explode
을 반환하는지 알 수 없습니다.


예를 들어,이 같은 것을 확인 할 수 있습니다 물론

$parts = explode('/', $url); 
if (isset($parts[0])) { 
    $dir = $parts[0]; 
    if (isset($parts[1])) { 
    $act = $parts[1]; 
    } 
} 

, 최대 당신에게 상황을 처리하는 $dir 및/또는 $act이 설정되지 않은, 나중에 스크립트입니다.


또 다른 해결책은 (예를 들어 /의 수를 계산)을 반환합니다 폭발 얼마나 많은 요소를 확인하는 것입니다; 그러나 적어도 두 가지 경우를 처리해야합니다.

$segments = explode('/', $url); 
if (count($segments) !== 2) { 
    // error 
} else { 
    list($dir, $act) = $segments; 
} 

을하지만 어쩌면 당신은 list를 사용하는 것보다 더 유연한 접근 방식을 선택해야합니다 :

0

전체 URL을 폭발시키는 대신 $_SERVER['PATH_INFO']을 사용해보십시오. '/ random'이 스크립트의 이름을 지정한다고 가정하십시오.

+0

Downvoter : PATH_INFO에 무슨 문제가 있습니까? 문제는이 가능성을 허용하기에 모호합니다. – outis

0

간단하고보기 흉한 대답은 오류 출력을 억제하는 단일 '@'로 전체 앞에 접두사를 붙이는 것입니다.

$foo = explode('/',$url); 
$dir = $foo[0]; 
$act = $foo[1]; // This is where the notice comes from 
0

는 통지를 제거하는 :

list($dir, $act) = explode('/',$url); 

하지만

어쩌면 더 나은 솔루션이 될 것이다 : $ 행위 때문에 후드 경우에 null로 설정됩니다, 그것은 동등의

더 2 세그먼트가없는 경우
$segments = explode ('/', $url); 
$dir = array_shift ($segments); 
$act = array_shift ($segments); 

, $ 행위는 null이 될 것이며, 또한 2 개 이상의 세그먼트이 방법

11

에서이 시도 : 여기 당신의 가치와

list($dir, $act) = array_pad(explode('/',$url), 2, ''); 

array_pad 완전한 배열이다 : ''.

+1

¡ 완벽한! 이것이 최선의 방법입니다. – Rodrigo

0

PHP 5.4+의로 목록 할당에 E_NOTICE를 억제하는 올바른 방법은 다음 $url/를 포함하지

@list($dir, $act) = explode('/', $url); 

경우, 하나 개의 요소를 반환 폭발 $actNULL 될 것입니다.