2017-01-19 5 views
0

먼저, 용서 해주세요. 아직은 아주 새롭고 지금은 조금 피곤합니다.배열이 이상한 PHP Scandir 또는 Split 오류

나는 이것에 대한 내 재치가있다. 약간의 PHP 코드를 작성 했으므로, 작업중인 사이트에서 뉴스 레터를 쉽고 빠르게 업데이트 할 수 있습니다. 목표는 첫 번째 뉴스 레터를 포함 된 pdf로 표시 한 다음 나머지를 모두 그 아래 링크로 표시하는 것입니다. 따라서 뉴스 레터를 작성하는 모든 사용자는 폴더에 해당 뉴스 레터를 배치하고 적절한 명명 형식을 사용해야합니다.

나는 scandir을 사용하여 디렉토리를 스캔하고 모든 파일을 내림차순으로 반환합니다. 그러면 가장 최근 파일이 정확하게 (YYYY/MM) 명명 된 경우 먼저 제공됩니다. 그런 다음 파일 이름을 위로 나눠서 달의 실제 이름을 반환하는 함수에 전달하고 모든 것을 html에 연결하여 페이지를 생성합니다.

한 가지를 제외하고는 완벽하게 작동합니다. 파일 중 하나에 해당 월이 표시되지 않습니다. screenshot에서 2014 년 8 월의 파일에 해당 월이 표시되지 않으며 간단하게 파악할 수 없다는 것을 알 수 있습니다. (바닥에있는 물건에 대해 미안 해요. 충분한 인원이 없기 때문에 2 인 이상의 링크를 게시 할 수 없습니다. 모든 이미지를 하나의 이미지로 만들고, 아래쪽 절반은 무시하십시오.)

다음 코드는 내 주요 프로그램은 내가 한 문제 해결의 일부를 볼 수있는 스크린 샷에서

//sort in descending order so the most recent date is first 
$newsletterarray=scandir("../docs/newsletter", SCANDIR_SORT_DESCENDING); 

//print_r($newsletterarray); //shows all the values    

//Splits the selected newsletter array into another array, [1] will be the month which can be passed into month.php 
$month = split("_", $newsletterarray[0]); 

$filenameSplit = split("_", $newsletterarray[0]); 
//The most recent newsletter is embedded 
echo('<p> 
    <a href="../docs/newsletter/' . $newsletterarray[0] . '"><h4 align="justify">' . getMonth($filenameSplit[1]) . ' ' . $filenameSplit[0] . ' Newsletter</h4></a> 
</p>        
<p> 
    <object width="50%" height="500px" data="../docs/newsletter/' . $newsletterarray[0] . '" type="application/pdf"></object> 
</p><br> <h4>Older Newsletters</h4>'); 

//starts at 1 so it skips the most recent newsletter 
//increments until it reaches 3 less than max, otherwise it shows directory stuff 
for($i = 1; $i <= (count($newsletterarray) - 3); $i++) { 
    $filenameSplit = split("_", $newsletterarray[$i]); 
    echo('<a href="../docs/newsletter/' . $newsletterarray[$i] . '">' . getMonth($filenameSplit[1]) . ' ' . $filenameSplit[0] . ' Newsletter</a><br>'); 
} 

function getMonth($nummonth) { 
    switch ($nummonth) { 
     case 01: 
      return "January"; 
      break; 
     case 02; 
      return "February"; 
      break; 
     case 03: 
      return "March"; 
      break; 
     case 04: 
      return "April"; 
      break; 
     case 05: 
      return "May"; 
      break; 
     case 06: 
      return "June"; 
      break; 
     case 07: 
      return "July"; 
      break; 
     case 08: 
      return "August"; 
      break; 
     case 09: 
      return "September"; 
      break; 
     case 10: 
      return "October"; 
      break; 
     case 11: 
      return "November"; 
      break; 
     case 12: 
      return "December"; 
      break; 
     default: 
      return ""; 
      break; 
    } 
} 

을 (형식 미안, 나 때문에 이런 바보 같은 제한으로 일을 결합했다). 스플릿에 1이 08에 대한 올바른 값이어야한다고 나와 있지만 getMonth 함수로 전달하면 작동하지 않습니다. 08에 전달하면 잘 동작하므로 오류는 getMonth 함수에없는 것 같습니다. 이 외에도 오류를 전혀 변경하지 않은 실제 디렉터리에 파일을 추가하려고했지만 의도 한 기능이 작동했습니다. 또한 문제가있는 파일을 제거하고 같은 이름을 가진 다른 파일의 이름을 바꾸려고 시도했지만 동일한 오류가 발생했습니다.

정말이 파일이 작동하지 못하게하는 무언가를 쓴 바보 같은 오류 일뿐입니다. 정말 슬픔을 느끼고 있습니다. 고맙습니다.

답변

0

가장 큰 문제는 유형 혼합입니다. 귀하의 split() 호출은 문자열 배열 ('01', '02'등)을 반환하지만, getMonth() 함수는 값이 (01, 02 등).

자, PHP는 type juggling을 수행하기 때문에 이것을 허용합니다. 그러나 스위치 내부의 숫자가 어떻게 해석되는지에 대해 더 많은 문제가 있습니다. 특히 앞에 오는 0은 예상되는 10 진수 (10 진수)가 아닌 8 진수 (8 진수)로 해석되도록합니다.

우리는 세부 사항을 자세히 조사 할 수 있지만 숫자를 일관되게 나타내는 것으로이를 해결해야하기 때문에 실제로 중요하지 않습니다. 이 작업을 수행하는 가장 빠른 방법은 인용 값 속하는 getMonth() 내부 스위치 각각의 값을 대체하는 것입니다 : 일들이 당신을 위해 작업을 진행한다

function getMonth($nummonth) { 
    switch ($nummonth) { 
     case '01': 
      return "January"; 
      break; 
     case 02; 
      return "February"; 
      break; 
     case '03': 
      return "March"; 
      break; 
     case '04': 
      return "April"; 
      break; 
     case '05': 
      return "May"; 
      break; 
     case '06': 
      return "June"; 
      break; 
     case '07': 
      return "July"; 
      break; 
     case '08': 
      return "August"; 
      break; 
     case '09': 
      return "September"; 
      break; 
     case '10': 
      return "October"; 
      break; 
     case '11': 
      return "November"; 
      break; 
     case '12': 
      return "December"; 
      break; 
     default: 
      return ""; 
      break; 
    } 
} 

. 그것은 그 값을 문자열로 보아서 작동합니다. 따라서 값을 매기는 값으로 $ nummonth 동안 전달하는 값과 매치 할 것입니다.그 너머

는하지만, 나에게 몇 가지 다른 팁을 허용 :

  1. 분할() 함수는 최근 PHP 버전에서도 사용할 수 없습니다 죽었다. 정규 표현식으로 문자열을 분할해야하는 경우 preg_split()을 사용하십시오. 이 경우에는 문자열 상수 ('_')로 분할하는 것만으로 explode()를 사용할 수 있으므로 여기서 필요한 것을 정확하게 수행 할 수 있습니다. 매개 변수를 변경하지 않고 split() 호출을 explode() 호출로 전환하기 만하면됩니다.
  2. echo를 사용하여 HTML을 추출 할 때 실제로는 이스케이프 처리해야합니다. PHP의 htmlentities() 함수를 참조하십시오. 표시된 특정 파일 이름 데이터를 사용하면 문제가 발생하지 않지만 다른 데이터로 인해 페이지가 오작동하거나 보안 취약성이 발생할 수 있습니다.
  3. $ month 변수 행을 삭제할 수 있습니다. 그 변수를 사용하지 않고 그 바로 뒤에 $ filenameSplit 변수가 있습니다.이 변수는 똑같은 이름이지만 이름이 훨씬 좋습니다.
  4. getMonth() 함수 자체를 단순화 할 수 있습니다. 이와 같은 간단한 매핑을 위해 종종 배열을 사용하고 싶습니다. 이 기술을 사용하면 함수가 아래의 getMonth2()처럼 보일 수 있습니다. 이 방법에 대해 알아 보려면 PHP's docs on arrays을 참조하십시오. 그러나 달 번호를 이름으로 변환하는이 특별한 경우에는 아래의 getMonth3()과 같이 한 줄로 줄일 수 있습니다. 이 방법에 대해 알아 보려면 date()strtotime()의 문서를 참조하십시오.

대안 1 :

function getMonth2($nummonth) { 
    $months = array(
     '01' => 'January', 
     '02' => 'February', 
     '03' => 'March', 
     '04' => 'April', 
     '05' => 'May', 
     '06' => 'June', 
     '07' => 'July', 
     '08' => 'August', 
     '09' => 'September', 
     '10' => 'October', 
     '11' => 'November', 
     '12' => 'December', 
    ); //$months 

    return $months[$nummonth]; 
} //getMonth2 

대안 2 : 사용 PHP 일자 관련 기능

function getMonth3($nummonth) { 
    return date('F', strtotime("2017-$nummonth")); 
} //getMonth3 
지도와 같은 배열을 사용