2011-08-14 126 views
0

這裏是我的腳本(它的一部分,但它涵蓋了什麼,我想告訴):爲什麼isset()函數不能識別的變量,即使它存在

   $data = explode($this->delimeter,$buffer); 
       var_dump($this->callBack); 
       var_dump($columns); 

       foreach ($data as $key=>$val) { 
        if(isset($columns[$key]) && isset($this->callBack[$columns[$key]])) { 
         echo "called $key<br/>"; 
         call_user_func(array($this,$this->callBack[$columns[$key]]),trim($val)); 

        } 
       } 

,這裏是它的輸出:

array 
    'FacilityID' => string 'setFacilityID' (length=13) 
    'FacilityName' => string 'setFacilityName' (length=15) 
array 
    0 => string 'FacilityID' (length=13) 
    1 => string 'FacilityName' (length=12) 
called 1 

我的問題: 爲什麼called 1只能來,而called 0不來輸出?我的意思是$this->callBack[$columns[$key]]對嗎?我錯過了什麼。

從我看到的:isset($columns[$key])TRUE兩者,而isset($this->callBack[$columns[$key]])的第二個條件對於「FacilityID」爲假?爲什麼? PS:從我看到的所有索引都被定義。

EDIT 2我的腳本功能全面:

function parseFile() { 
     error_reporting(E_ALL); 
     $f=fopen($this->file,"r"); 
     if($f) { 
      $buffer = NULL; 
      $columns = array(); 
      $data = array(); 
      $firstLine = true; 
      while(($buffer = fgets($f,4096)) !== false) { 

       if($firstLine) { 
        $columns = explode($this->delimeter,$buffer); 
        foreach ($columns as $key=>$val) { 
         $columns[$key] = trim($val); 
        } 
        $firstLine = false; 
       } 
       else { 
       //not first line 
        $data = explode($this->delimeter,$buffer); 
        var_dump($this->callBack); 
        var_dump($columns); 
        var_dump($data); 
        foreach ($data as $key=>$val) { 
         echo $columns[$key].' '; 
         if(isset($columns[$key]) && isset($this->callBack[$columns[$key]])) { 
          echo "called $key<br/>"; 
          call_user_func(array($this,$this->callBack[$columns[$key]]),trim($val)); 

         } 
        } 
       } 
      } 
      if(!feof($f)) { 
       throw new Exception("Unexpected error. Parsing stopped in middle"); 
      } 
     } 
     else { 
      throw new Exception("File Not Found"); 
     } 
    } 

我更新的輸出:

array 
    'FacilityID' => string 'setFacilityID' (length=13) 
    'FacilityName' => string 'setFacilityName' (length=15) 
array 
    0 => string 'FacilityID' (length=13) 
    1 => string 'FacilityName' (length=12) 
array 
    0 => string '1' (length=1) 
    1 => string '"Business Center"' (length=17) 
FacilityID FacilityName called 1 
+0

你可以在'foreach'之前添加'var_dump($ data);'嗎? –

+0

'var_dump($ data)'在'var_dump($ columns);'後面添加並且輸出已更新 – footy

+0

@footy您是否打開了所有錯誤報告?也許錯誤正在產生... – Endophage

回答

1
<?php 
// Reads past the UTF-8 bom if it is there. 
// Credit for the function: http://www.php.net/manual/en/function.fopen.php#78308 
function fopen_utf8 ($filename, $mode) { 
    $file = fopen($filename, $mode); 
    $bom = fread($file, 3); 
    if ($bom != b"\xEF\xBB\xBF") { 
     rewind($file, 0); 
    } 
    return $file; 
} 
?> 

在Op可以選擇「答案」TM之前應該有24小時鎖定。儘早按下按鈕太誘人了。

+0

+1表示正確的方式。但不是'fread($ file,3)'有點粗俗?我的意思是它會一直保持3個字節?不管它從文件類型到文件類型都不相同。有沒有一個標準的方法來做到這一點? – footy

+0

除了等待承諾提供更完整的unicode支持的PHP6以外,以下是流行BOM的列表http://www.opentag.com/xfaq_enc.htm – Gerry

+1

儘管您確實應該這樣做:\t \t \t \t \t $ enc = mb_detect_encoding($ buffer); $ data = mb_convert_encoding($ buffer,「ASCII」,$ enc);由於BOM是有原因的。 – Gerry

1

有一件事我注意到0 => string 'FacilityID' (length=13)看起來錯了... FacilityID只有長度10 ...不知道你是如何結束的,但有一些事情要從頭開始...嘗試修剪你的值在$columns,因爲那裏肯定有一些壞字符。或者試着弄清楚在執行的其餘部分中哪個值正在被損壞。

UPDATE

看到這個Q/A What does it mean when var_dump reports the wrong string length?

是否CSV包含XML/HTML可能被搞砸了字符串的長度。另外,請看使用fgetcsv來簡化代碼。您可能會發現單獨修復您的代碼,因爲它會處理爲您清理線條和分隔符。

+0

即使我很困惑。我已經把完整的腳本。我也修剪它。但是這仍然發生。它會轉到文件上做些什麼嗎?它是一個CSV逗號分隔的文件,所有。 2行。 – footy

+0

@footy查看更新 – Endophage

+0

我已經在我的答案中上傳了輸入文件並給出了一個鏈接。另外我知道fgetcsv函數,但只是試用我自己的方法,而不是使用它來學習。現在我知道CSV在開始時有一些額外符號的難題! – footy

0

嗯,適合我。這兩條線是輸出

<?php 
$callback = array(
    'FacilityID' => 'setFacilityID', 
    'FacilityName' => 'setFacilityName' 
); 
$columns = array(
    0 => 'FacilityID', 
    1 => 'FacilityName' 
); 
$data = array(
    0 => '1', 
    1 => '"Business Center"' 
); 

var_dump($callback); 
var_dump($columns); 
var_dump($data); 

foreach ($data as $key=>$val) { 
    if(isset($columns[$key]) && isset($callback[$columns[$key]])) { 
     echo "---called $key---<br/>"; 
     call_user_func(array($this,$callback[$columns[$key]]),trim($val)); 
    } 
} 

輸出:

array(2) { 
    ["FacilityID"]=> 
    string(13) "setFacilityID" 
    ["FacilityName"]=> 
    string(15) "setFacilityName" 
} 
array(2) { 
    [0]=> 
    string(10) "FacilityID" 
    [1]=> 
    string(12) "FacilityName" 
} 
array(2) { 
    [0]=> 
    string(1) "1" 
    [1]=> 
    string(17) ""Business Center"" 
} 
---called 0---<br/>PHP Notice: Undefined variable: this in /home/gerry/stack.php on line 22 
PHP Warning: call_user_func() expects parameter 1 to be a valid callback, first array member is not a valid class name or object in /home/gerry/stack.php on line 22 
---called 1---<br/>PHP Notice: Undefined variable: this in /home/gerry/stack.php on line 22 
PHP Warning: call_user_func() expects parameter 1 to be a valid callback, first array member is not a valid class name or object in /home/gerry/stack.php on line 22 

所以我猜測它的前提是你提供給我們的代碼或數據之外的東西是不準確的。

+0

是的,它適用於你,因爲'0 => string'FacilityID'(length = 10)'對你來說'0 => string'FacilityID'(length = 13)'對我來說!這裏有什麼問題?我從CSV文件中讀取數據。 – footy

+1

不知道,但你知道這個功能:http://php.net/manual/en/function.fgetcsv.php – Gerry

+0

你可能需要上傳輸入文件 – Gerry

0

這是一個非常奇怪的錯誤。每個人都試圖回答這個問題,但是不能因爲我發現錯誤不是與腳本有關,而是我讀取的外部文件。該文件位於here。如果我以某種方式使用了這3個額外的字符,即使trim()被稱爲正在進入輸入,那麼未被裁減。如果有人能夠在這個問題上發現更多的光芒,那將是一件好事。可能這本身就是一個新問題。

但我解決了這個問題,只是將記事本中的內容複製粘貼到另一個文件並保存。但這不是一個好方法。如果有人有更好的答案,請發佈。

相關問題