2013-09-27 129 views
2

我得到這個錯誤調用未定義功能str_getcsv()

調用未定義功能str_getcsv()

這似乎是一個PHP版本。它直到5.3版纔出來。

任何人都知道一種方式替換這個函數,而不是升級PHP版本?

+1

檢查手冊第一http://php.net/manual/en/function.str-getcsv.php –

+1

您的字符串寫入PHP://然後倒回溫並用f_getcsv() –

回答

7

我不知道這是否實際工作,但手冊頁面上有一些示例實現,你可以爲這樣的後備使用:

if(!function_exists('str_getcsv')) { 
    function str_getcsv($input, $delimiter = ',', $enclosure = '"') { 

     if(! preg_match("/[$enclosure]/", $input)) { 
      return (array)preg_replace(array("/^\\s*/", "/\\s*$/"), '', explode($delimiter, $input)); 
     } 

     $token = "##"; $token2 = "::"; 
     //alternate tokens "\034\034", "\035\035", "%%"; 
     $t1 = preg_replace(array("/\\\[$enclosure]/", "/$enclosure{2}/", 
      "/[$enclosure]\\s*[$delimiter]\\s*[$enclosure]\\s*/", "/\\s*[$enclosure]\\s*/"), 
      array($token2, $token2, $token, $token), trim(trim(trim($input), $enclosure))); 

     $a = explode($token, $t1); 
     foreach($a as $k=>$v) { 
      if (preg_match("/^{$delimiter}/", $v) || preg_match("/{$delimiter}$/", $v)) { 
       $a[$k] = trim($v, $delimiter); $a[$k] = preg_replace("/$delimiter/", "$token", $a[$k]); } 
     } 
     $a = explode($token, implode($token, $a)); 
     return (array)preg_replace(array("/^\\s/", "/\\s$/", "/$token2/"), array('', '', $enclosure), $a); 

    } 
} 
+0

非常完美,非常感謝 – Jam

0

啊哈,我在php manual

<?php 
if (!function_exists('str_getcsv')) { 
    function str_getcsv($input, $delimiter = ',', $enclosure = '"', $escape = '\\', $eol = '\n') { 
     if (is_string($input) && !empty($input)) { 
      $output = array(); 
      $tmp = preg_split("/".$eol."/",$input); 
      if (is_array($tmp) && !empty($tmp)) { 
       while (list($line_num, $line) = each($tmp)) { 
        if (preg_match("/".$escape.$enclosure."/",$line)) { 
         while ($strlen = strlen($line)) { 
          $pos_delimiter  = strpos($line,$delimiter); 
          $pos_enclosure_start = strpos($line,$enclosure); 
          if ( 
           is_int($pos_delimiter) && is_int($pos_enclosure_start) 
           && ($pos_enclosure_start < $pos_delimiter) 
           ) { 
           $enclosed_str = substr($line,1); 
           $pos_enclosure_end = strpos($enclosed_str,$enclosure); 
           $enclosed_str = substr($enclosed_str,0,$pos_enclosure_end); 
           $output[$line_num][] = $enclosed_str; 
           $offset = $pos_enclosure_end+3; 
          } else { 
           if (empty($pos_delimiter) && empty($pos_enclosure_start)) { 
            $output[$line_num][] = substr($line,0); 
            $offset = strlen($line); 
           } else { 
            $output[$line_num][] = substr($line,0,$pos_delimiter); 
            $offset = ( 
               !empty($pos_enclosure_start) 
               && ($pos_enclosure_start < $pos_delimiter) 
               ) 
               ?$pos_enclosure_start 
               :$pos_delimiter+1; 
           } 
          } 
          $line = substr($line,$offset); 
         } 
        } else { 
         $line = preg_split("/".$delimiter."/",$line); 

         /* 
         * Validating against pesky extra line breaks creating false rows. 
         */ 
         if (is_array($line) && !empty($line[0])) { 
          $output[$line_num] = $line; 
         } 
        } 
       } 
       return $output; 
      } else { 
       return false; 
      } 
     } else { 
      return false; 
     } 
    } 
} 
?> 
+1

你還在使用'str_getcsv' –

+0

@ShankarDamodaran,謝謝。你很熱心。 – srain

0

你可以嘗試用fgetcsv()做雖然你必須打開該文件,進入流能夠閱讀它發現這個代碼片斷。

例子:

$fh = fopen('php://temp', 'r+'); 
fwrite($fh, $string); 
rewind($fh); 

$row = fgetcsv($fh); 

fclose($fh); 
0

我發現上面的代碼片段沒有正確解析csv文件,其中的條目包含在引號中並且包含逗號本身。

但是,您可以將其他答案組合在一起,爲我工作。

基本上,如果未定義str_getcsv函數,請自己定義它,並且其實現應創建一個內存文件句柄,然後將其傳遞給fgetcsv。出於某種原因,GoDaddy上的PHP(我託管一個站點)沒有str_getcsv,但是有fgetcsv。去搞清楚。

if (!function_exists('str_getcsv')) { 
    function str_getcsv($input, $delimiter = ',', $enclosure = '"', $escape = '\\', $eol = '\n') { 
     $fh = fopen('php://temp', 'r+'); 
     fwrite($fh, $input); 
     rewind($fh); 

     $row = fgetcsv($fh); 

     fclose($fh); 
     return $row; 
    } 
}