2010-11-09 128 views
2

嘿,夥計們,我有點問題。我將textarea的值作爲一個數組,然後我做了一個foreach循環,並且它變得混亂,我有兩個函數可以與變量一起工作,但是隻有一個函數可以正常工作,另一個函數只能工作在數組的最後一個對象上。 (我沒有太大的PHP專家,使代碼看起來凌亂)Foreach循環問題(只有最後一個變量)

<form action="example.php" method="post"> 
    <textarea name="tran" id="tran" rows="25" cols="20"></textarea> 

    <input name="submit" type="submit" value="Submit"> 
</form> 



<?php 
function translate($line) { 
    $url = "http://m.translate.ru/translator/result/?text=$line&dirCode=gr"; 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_USERAGENT, "Opera/9.63 (Windows NT 5.1; U; ru) Presto/2.1.1"); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    $html = curl_exec($ch); 
    curl_close($ch); 
    preg_match('/<div class=\"tres\">(.*)<\/div><div class=\"tinfo\">/', $html, $translate); 
    $blabla = strip_tags($translate[0]); 
    return $blabla; 

} 
if(isset($_POST['submit'])) { 
require("GTranslate.php"); 


$text = trim($_POST['tran']); 
$textAr = explode("\n", $text); 

$fp = fopen('data.txt', 'a+'); 
foreach ($textAr as $line) { 
try{ 
     $gt = new Gtranslate; 
    $transl = $gt->german_to_english($line); 
    $more_precise = translate($line); 

fwrite($fp, $line); 
fwrite($fp, "|"); 
fwrite($fp, $transl); 
fwrite($fp, "|"); 
fwrite($fp, $more_precise); 
fwrite($fp, "\n"); 


} catch (GTranslateException $ge) 
{ 
     echo $ge->getMessage(); 
} 
} 
fclose($fp); 
} 
?> 

這裏的Gtranslate.php(從谷歌代碼得到它):

<?php 

/** 
* GTranslate - A class to comunicate with Google Translate(TM) Service 
*    Google Translate(TM) API Wrapper 
*    More info about Google(TM) service can be found on http://code.google.com/apis/ajaxlanguage/documentation/reference.html 
*  This code has o affiliation with Google (TM) , its a PHP Library that allows to comunicate with public a API 
* 
* This program is free software: you can redistribute it and/or modify 
* it under the terms of the GNU General Public License as published by 
* the Free Software Foundation, either version 3 of the License, or 
* (at your option) any later version. 
* 
* This program is distributed in the hope that it will be useful, 
* but WITHOUT ANY WARRANTY; without even the implied warranty of 
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
* GNU General Public License for more details. 
* 
* You should have received a copy of the GNU General Public License 
* along with this program. If not, see <http://www.gnu.org/licenses/>. 
* 
* @author Jose da Silva <[email protected]> 
* @since 2009/11/18 
* @version 0.7.4 
* @licence LGPL v3 
* 
* <code> 
* 

    <? 
    * require_once("GTranslate.php"); 
    * try{ 
    * $gt = new Gtranslate; 
    * echo $gt->english_to_german("hello world"); 
    * } catch (GTranslateException $ge) 
    * { 
    * echo $ge->getMessage(); 
    * } 
    * ?> 
    * </code> 
    */ 


    /** 
    * Exception class for GTranslated Exceptions 
    */ 

    class GTranslateException extends Exception 
    { 
     public function __construct($string) { 
      parent::__construct($string, 0); 
     } 

     public function __toString() { 
      return __CLASS__ . ": [{$this->code}]: {$this->message}\n"; 
     } 
    } 

    class GTranslate 
    { 
     /** 
     * Google Translate(TM) Api endpoint 
     * @access private 
     * @var String 
     */ 
     private $url = "http://ajax.googleapis.com/ajax/services/language/translate"; 

      /** 
      * Google Translate (TM) Api Version 
      * @access private 
      * @var String 
      */ 
     private $api_version = "1.0"; 

      /** 
      * Comunication Transport Method 
     * Available: http/curl 
      * @access private 
      * @var String 
      */ 
     private $request_type = "http"; 

      /** 
      * Path to available languages file 
      * @access private 
      * @var String 
      */ 
     private $available_languages_file = "languages.ini"; 

      /** 
      * Holder to the parse of the ini file 
      * @access private 
      * @var Array 
      */ 
     private $available_languages = array(); 

     /** 
     * Google Translate api key 
     * @access private 
     * @var string 
     */ 
     private $api_key = null; 

     /** 
     * Google request User IP 
     * @access private 
     * @var string 
     */ 
     private $user_ip = null; 

      /** 
      * Constructor sets up {@link $available_languages} 
      */ 
     public function __construct() 
     { 
      $this->available_languages = parse_ini_file("languages.ini"); 
     } 

      /** 
      * URL Formater to use on request 
      * @access private 
      * @param array $lang_pair 
     * @param array $string 
     * "returns String $url 
      */ 

     private function urlFormat($lang_pair,$string) 
     { 
      $parameters = array(
       "v" => $this->api_version, 
       "q" => $string, 
       "langpair"=> implode("|",$lang_pair) 
      ); 

      if(!empty($this->api_key)) 
      { 
       $parameters["key"] = $this->api_key; 
      } 

      if(empty($this->user_ip)) 
      { 
       if(!empty($_SERVER["REMOTE_ADDR"])) 
       { 
        $parameters["userip"] = $_SERVER["REMOTE_ADDR"]; 
       } 
      } else 
      { 
       $parameters["userip"] = $this->user_ip; 
      } 

      $url = ""; 

      foreach($parameters as $k=>$p) 
      { 
       $url .= $k."=".urlencode($p)."&"; 
      } 
      return $url; 
     } 

     /** 
     * Define the request type 
     * @access public 
     * @param string $request_type 
     * return boolean 
     */ 
     public function setRequestType($request_type = 'http') { 
      if (!empty($request_type)) { 
        $this->request_type = $request_type; 
       return true; 
      } 
      return false; 
     } 

     /** 
     * Define the Google Translate Api Key 
     * @access public 
     * @param string $api_key 
     * return boolean 
     */ 
     public function setApiKey($api_key) { 
      if (!empty($api_key)) { 
        $this->api_key = $api_key; 
       return true; 
      } 
      return false; 
     } 

     /** 
     * Define the User Ip for the query 
     * @access public 
     * @param string $ip 
     * return boolean 
     */ 
     public function setUserIp($ip) { 
      if (!empty($ip)) { 
        $this->user_ip = $ip; 
       return true; 
      } 
      return false; 
     } 

      /** 
      * Query the Google(TM) endpoint 
      * @access private 
      * @param array $lang_pair 
      * @param array $string 
      * returns String $response 
      */ 

     public function query($lang_pair,$string) 
     { 
      $query_url = $this->urlFormat($lang_pair,$string); 
      $response = $this->{"request".ucwords($this->request_type)}($query_url); 
      return $response; 
     } 

      /** 
      * Query Wrapper for Http Transport 
      * @access private 
      * @param String $url 
      * returns String $response 
      */ 

     private function requestHttp($url) 
     { 
      return GTranslate::evalResponse(json_decode(file_get_contents($this->url."?".$url))); 
     } 

      /**  
      * Query Wrapper for Curl Transport 
      * @access private 
      * @param String $url 
      * returns String $response 
      */ 

     private function requestCurl($url) 
     { 
      $ch = curl_init(); 
      curl_setopt($ch, CURLOPT_URL, $this->url); 
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
      curl_setopt($ch, CURLOPT_REFERER, !empty($_SERVER["HTTP_REFERER"]) ? $_SERVER["HTTP_REFERER"] : ""); 
      curl_setopt($ch, CURLOPT_POST, 1); 
      curl_setopt($ch, CURLOPT_POSTFIELDS, $url); 
      $body = curl_exec($ch); 
      curl_close($ch); 
      return GTranslate::evalResponse(json_decode($body)); 
     } 

      /**  
      * Response Evaluator, validates the response 
     * Throws an exception on error 
      * @access private 
      * @param String $json_response 
      * returns String $response 
      */ 

     private function evalResponse($json_response) 
     { 
      switch($json_response->responseStatus) 
      { 
       case 200: 
        return $json_response->responseData->translatedText; 
        break; 
       default: 
        throw new GTranslateException("Unable to perform Translation:".$json_response->responseDetails); 
       break; 
      } 
     } 


      /**  
      * Validates if the language pair is valid 
      * Throws an exception on error 
      * @access private 
      * @param Array $languages 
      * returns Array $response Array with formated languages pair 
      */ 

     private function isValidLanguage($languages) 
     { 
      $language_list = $this->available_languages; 

      $languages  = array_map("strtolower", $languages); 
      $language_list_v = array_map("strtolower", array_values($language_list)); 
      $language_list_k = array_map("strtolower", array_keys($language_list)); 
      $valid_languages = false; 
      if(TRUE == in_array($languages[0],$language_list_v) AND TRUE == in_array($languages[1],$language_list_v)) 
      { 
       $valid_languages = true; 
      } 

      if(FALSE === $valid_languages AND TRUE == in_array($languages[0],$language_list_k) AND TRUE == in_array($languages[1],$language_list_k)) 
      { 
       $languages = array($language_list[strtoupper($languages[0])],$language_list[strtoupper($languages[1])]); 
       $valid_languages  =  true; 
      } 

      if(FALSE === $valid_languages) 
      { 
       throw new GTranslateException("Unsupported languages (".$languages[0].",".$languages[1].")"); 
      } 

      return $languages; 
     } 

      /**  
      * Magic method to understande translation comman 
     * Evaluates methods like language_to_language 
      * @access public 
     * @param String $name 
      * @param Array $args 
      * returns String $response Translated Text 
      */ 


     public function __call($name,$args) 
     { 
      $languages_list  = explode("_to_",strtolower($name)); 
      $languages = $this->isValidLanguage($languages_list); 

      $string  = $args[0]; 
      return $this->query($languages,$string); 
     } 
    } 

    ?> 

Gtranslate.php沒有按」沒有任何問題,它工作正常。

所以再次關於我的問題,我做了一個foreach循環從文本文件中的單詞,每個被翻譯成英文,然後我得到另一個數據(但更精確的我)第一部分工作正常,第二部分只適用於數組的最後一個單詞。

我希望你明白我的問題是什麼。

非常感謝您的回答。

+0

你怎麼知道它只適用於最後的單詞?你有沒有檢查哪些參數傳遞給'translate()'? – 2010-11-09 22:47:38

+0

似乎無法看到任何錯誤。你的翻譯功能似乎沒問題。舉一個輸入數組的例子並輸出結果 – Stewie 2010-11-09 22:50:29

回答

1

嘗試在循環播放數據之後移動您的剪輯,否則每行仍可能有空白前後。

<form action="example.php" method="post"> 
    <textarea name="tran" id="tran" rows="25" cols="20"></textarea> 

    <input name="submit" type="submit" value="Submit"> 
</form> 



<?php 
function translate($line) { 
    $url = "http://m.translate.ru/translator/result/?text=$line&dirCode=gr"; 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_USERAGENT, "Opera/9.63 (Windows NT 5.1; U; ru) Presto/2.1.1"); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    $html = curl_exec($ch); 
    curl_close($ch); 
    preg_match('/<div class=\"tres\">(.*)<\/div><div class=\"tinfo\">/', $html, $translate); 
    $blabla = strip_tags($translate[0]); 
    return $blabla; 

} 
if(isset($_POST['submit'])) { 
require("GTranslate.php"); 



$textAr = explode("\n", $_POST['tran']); 

$fp = fopen('data.txt', 'a+'); 
foreach ($textAr as $line) { 
try{ 

     $gt = new Gtranslate; 
    $transl = $gt->german_to_english(trim($line)); 
    $more_precise = translate($line); 

fwrite($fp, $line."|".$transl."|".$more_precise."\n"); 


} catch (GTranslateException $ge) 
{ 
     echo $ge->getMessage(); 
} 
} 
fclose($fp); 
} 
?> 
+0

謝謝。移動修剪部分到循環幫助。 – Bndr 2010-11-10 06:55:21