【问题标题】:Advanced PHP loop高级 PHP 循环
【发布时间】:2018-06-28 11:23:19
【问题描述】:

我从数据库中获取翻译并希望在 Javascript 对象中生成它,例如:

var Lang = {
  eng: {
    txtUserName: 'Username',
    txtLogout: 'Logout'
  },
  dnk: {
    txtUserName: 'Brugernavn',
    txtLogout: 'Afslut'
  }
}

我陷入了循环,得到的结果不是我需要的。 这是我的 PHP:

var Lang = {
    <?php
      $allLangs = $this->params->getLanguages;
      foreach ($allLangs as $allLang) :
        echo $allLang->lang_code . ': ';
        echo '{';
        foreach ( $translationsall as $translation ) :
            if ( $translation['it_text'] == 'txtUserName' ) :
              for ( $i = 1; $i <= 1; $i++ ){
                    var_dump($translationsall[$i]);
              }
            endif;
        endforeach;
        echo '},';
        echo "\r\n";
        endforeach;
    ?>
}

这就是我得到的:

var Lang = {
  dnk: {array(2) {
    ["it_text"]=>
    string(8) "appTitle"
    ["it_name"]=>
    string(3) "VMS"
  }
  array(2) {
    ["it_text"]=>
    string(8) "appTitle"
    ["it_name"]=>
    string(3) "VMS"
  }
},
eng: {array(2) {
  ["it_text"]=>
  string(8) "appTitle"
  ["it_name"]=>
  string(3) "VMS"
}
array(2) {
  ["it_text"]=>
  string(8) "appTitle"
  ["it_name"]=>
  string(3) "VMS"
}
}

如何编辑我的循环以获得我需要的结果?

也许有更聪明的方法来生成 Lang 对象?

而且,忘了说我只需要很少的翻译,这就是为什么我在 PHP 中有这个的原因:

if ( $translation['it_text'] == 'txtUserName' ) :
  //stuff
endif;

欢迎任何想法:)

这是我从 var_dump($translationsall) 得到的:

array(2748) {
 [0]=>
 array(2) {
   ["it_text"]=>
   string(8) "appTitle"
   ["it_name"]=>
   string(3) "CMS"
 }
 [1]=>
 array(2) {
   ["it_text"]=>
   string(8) "appTitle"
   ["it_name"]=>
   string(3) "CMS"
 }
 [2]=>
  array(2) {
    ["it_text"]=>
    string(9) "txtLogout"
    ["it_name"]=>
    string(6) "Afslut"
  }
  [3]=>
  array(2) {
    ["it_text"]=>
    string(9) "txtLogout"
    ["it_name"]=>
    string(6) "Logout"
  }
  [4]=>
  array(2) {
    ["it_text"]=>
    string(10) "btnRefresh"
    ["it_name"]=>
    string(9) "Hent Igen"
  }
  [5]=>
  array(2) {
    ["it_text"]=>
    string(10) "btnRefresh"
    ["it_name"]=>
    string(7) "Refresh"
  }
 }

【问题讨论】:

  • 使用json_encode() 是构建输出数据结构的更好方法吗?
  • 我不明白的一件事是您循环遍历语言并遍历 $translationsall 中的所有值。两者之间似乎没有联系 - 特别是因为您的 $translationsall 转储没有语言指示符。
  • 我更改了查询,因此翻译结果有一个 lang_code,因此我创建了新问题。你可以在这里找到它:stackoverflow.com/questions/51096078/…

标签: php nested-loops


【解决方案1】:

请不要这样做。 - 对生成所需数据的 PHP 后端进行 API 调用。 - 使用开箱即用的函数,例如来自 jQuery 或其他预构建框架的 $.ajax 将帮助您实现这一目标。

如果您仍然想动态执行此操作(您的问题) - 删除 var_dump - 这最终会转储类型和其他详细信息(应该如此)并使用 foreach (key, value)这将帮助您生成所需的内容。 - 但是,我建议你看看如何使用 Laravel 或其他框架提供 API,而不是沿着这条狡猾的路线走下去。

【讨论】:

    【解决方案2】:

    您可以使用 JSON 将数据从 PHP 传递到 JS
    在 PHP 中,您可以使用 json_encode():

    echo json_encode($translation);
    

    在你的 JS 中使用 JSON.parse():

    var obj = JSON.parse('{"key":value}');
    

    你可以这样做:

    <?php
    $allLangs = $this->params->getLanguages;
    $json = json_encode($allLangs);
    ?>
    <script>
        var Lang = JSON.parse('<?php echo $json; ?>');
    </script>
    

    【讨论】:

      【解决方案3】:

      正如这里的其他人已经提到的那样;像这样动态创建你的 javascript 是个坏主意——我会改为使用 JSON 来序列化和反序列化数据。无论如何,如果你坚持动态创作;它可能是类似的东西;

      var Lang = {
      <?php
        $allLangs = $this->params->getLanguages;
        foreach ($allLangs as $allLang) {
          echo $allLang->lang_code . ': {';
              foreach ( $translationsall as $translation ) {
                  $total_words_to_translate = count($translation);
                  for($i = 0; i <= $total_words_to_translate; $i++){
                      if ( $translation['it_text'] == 'txtUserName' ){
                          print("txtUserName: ".$translationsall[$i]);
                      }
                      if ( $translation['it_text'] == 'txtLogout' ){
                          print("txtLogout: ".$translationsall[$i]);
                      }
                  }
              }
           echo '},';
           echo "\r\n";
          }
      ?> }
      

      当我们不知道数据库/变量的结构/命名约定时,很难确定确切的代码。

      【讨论】:

        【解决方案4】:

        使用json_encode:

        var Lang = <?php
          $all_langs = $this->params->getLanguages();
          echo json_encode($all_langs);
        ?>;
        

        【讨论】:

        • var_dump($allLangs) 返回此array(2) { [0]=&gt; object(stdClass)#4188 (4) { ["lang_code"]=&gt; string(3) "dnk" ["lang_text"]=&gt; string(5) "Dansk" ["lang_invalid"]=&gt; NULL ["lang_locale"]=&gt; string(2) "da" } [1]=&gt; object(stdClass)#4189 (4) { ["lang_code"]=&gt; string(3) "eng" ["lang_text"]=&gt; string(7) "English" ["lang_invalid"]=&gt; NULL ["lang_locale"]=&gt; string(2) "en" }
        【解决方案5】:

        不确定我与数据定义有多接近,但我已将它们包含在内,以便您可以看到我的假设并希望能够根据您的需要进行调整。

        它的工作方式是它从$translationsall 数组的开头开始,并假定$allLangs 数组与条目的顺序相同(因此在本例中是 dnk,然后是 eng 值)。然后将它们填充到语言键下的输出中,it_text 作为键,it_name 作为翻译。

        $translationsall = [["it_text" => "txtLogout", "it_name"=>"Afslut"],
            ["it_text"=> "txtLogout", "it_name"=> "Logout"],
            ["it_text" => "txtLogout2", "it_name"=>"Afslut2"],
            ["it_text"=> "txtLogout2", "it_name"=> "Logout2"]
        ];
        
        $allLangs = [ (object)["lang_code"=> "dnk"], (object)["lang_code"=> "eng"] ];
        $countTrans = count($translationsall);
        $out = [];
        $i = 0;
        while( $i < $countTrans )    {
            foreach ( $allLangs as $language )  {
                $out[$language->lang_code][$translationsall[$i]["it_text"]] = $translationsall[$i]["it_name"];
                $i++;
            }
        }
        
        echo json_encode($out, JSON_PRETTY_PRINT);
        

        打印出来

        {
            "dnk": {
                "txtLogout": "Afslut",
                "txtLogout2": "Afslut2"
            },
            "eng": {
                "txtLogout": "Logout",
                "txtLogout2": "Logout2"
            }
        }
        

        【讨论】:

          【解决方案6】:

          你可以试试 echo 看看下面的代码:

          var Lang = {
          <?php
            $allLangs = $this->params->getLanguages;
            foreach ($allLangs as $allLang) :
              echo $allLang->lang_code . ': ';
              echo '{';
              foreach ( $translationsall as $translation ) :
                  if ( $translation['it_text'] == 'txtUserName' and $translation['itl_lang_code '] == $allLang->lang_code) :
              echo "txtUserName:'".$translation['it_text']."',txtLogout:'".$translation['it_name']."' ";
                    endif;
              endforeach;
                 echo '}';
              echo '},';
              echo "\r\n";
              endforeach;
          ?>
                    }
          

          【讨论】:

          • 我试过你的方法,但还是一样-我得到var Langasd = { dnk: {txtUserName':'Brugernavn' txtUserName':'Username' }}, eng: {txtUserName':'Brugernavn' txtUserName':'Username' }}, };
          • dnk:{} 中只有丹麦语文本,eng:{} 中只有英语
          • 如果 $translationsall 中存在 $allLang->lang_code ,您需要使用 $translationsall[$allLang->lang_code] 这样的密钥进行编辑吗
          • var_dump($translationsall) 返回数据库中的所有翻译,如前所述:array{[8]=&gt; array(2) { ["it_text"]=&gt; string(9) "txtLogout" ["it_name"]=&gt; string(6) "Afslut" } [9]=&gt; array(2) { ["it_text"]=&gt; string(9) "txtLogout" ["it_name"]=&gt; string(6) "Logout" }}
          • 但是你如何在 $translationsall 上分离 $allLang 因为我没有看到 lang 的键
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-11
          • 1970-01-01
          • 1970-01-01
          • 2019-10-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多