高级PHP循环

时间:2018-06-28 11:23:20

标签: php nested-loops

我从数据库获取翻译,并希望在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"
  }
 }

6 个答案:

答案 0 :(得分:1)

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

如果您仍然想动态执行此操作(您的问题),请删除var_dump-最终转储类型和其他详细信息(应有的话)并使用foreach(键,值),这将帮助您生成所需的内容。 -但宁愿走这条狡猾的路线,我还是建议您看一下如何使用Laravel或其他框架来提供API。

答案 1 :(得分:1)

您可以使用 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>

答案 2 :(得分:0)

您可以尝试使用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;
?>
          }

答案 3 :(得分:0)

正如这里的其他人已经提到的;像这样动态创建您的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 :(得分:0)

使用json_encode

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

答案 5 :(得分:0)

不确定我与数据定义的距离有多近,但是我已经将它们包括在内,以便您可以了解我的假设并希望能够根据需要进行调整。

它的工作方式是从$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"
    }
}