2013-09-27 91 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; 
    } 
}