Расширенный цикл PHP - PullRequest
       4

Расширенный цикл PHP

0 голосов
/ 28 июня 2018

Я получаю переводы из базы данных и хочу создать его в объекте 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"
}
}

Как мне отредактировать свои циклы, чтобы получить нужный мне результат?

Может быть, есть более умный способ создания объекта Ланга?

И, забыл упомянуть, что мне нужно всего несколько переводов, поэтому у меня это в 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 голосов
/ 28 июня 2018

Не уверен, насколько я близок с определениями данных, но я включил их, чтобы вы могли видеть, что я предполагаю, и, надеюсь, сможете адаптировать его к вашим потребностям.

Способ, которым он работает, заключается в том, что он начинается в начале массива $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"
    }
}
0 голосов
/ 28 июня 2018

Вы можете передавать данные из PHP в JS с JSON .
Из 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>
0 голосов
/ 28 июня 2018

Использовать json_encode :

var Lang = <?php
  $all_langs = $this->params->getLanguages();
  echo json_encode($all_langs);
?>;
0 голосов
/ 28 июня 2018

Как уже упоминалось здесь другими; Это плохая идея динамически создавать ваш 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";
    }
?> }

Трудно определить точный код, когда мы не знаем структуры / соглашений об именах вашей базы данных / переменных.

0 голосов
/ 28 июня 2018

Вы можете попробовать с эхо см. Ниже код:

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;
?>
          }
0 голосов
/ 28 июня 2018

Пожалуйста, не делай этого. - Сделайте вызов API для бэкэнда PHP, производящего необходимые вам данные. - Использование готовых функций, таких как $.ajax из jQuery или других готовых интегрированных сред, поможет вам достичь этого.

Если вы все еще хотите пойти по пути динамического выполнения этого (ваш вопрос) - удалите var_dump - который в конечном итоге сбрасывает тип и другие детали (как следует) и используйте foreach (ключ, значение) который поможет вам создать то, что вам нужно. - Но вместо того, чтобы идти по этому хитрому пути, я бы посоветовал вам посмотреть, как обслуживать API, используя Laravel или другие фреймворки.

...