2016-01-15 2 views
1

Это довольно простой, но у меня нет кусочка головоломки.Локализовать маркеры в PHP Array

У меня есть многомерный массив PHP, который, среди прочего, содержит некоторые строки. Я хотел бы перевести специальные строки в этом массиве на основе таблицы перевода или массива в PHP.

$r = array(
    0 => 'something', 
    1 => array(
     'othertext' => '1000 {{animals}} and {{cars}}', 
     'anytext' => '400 {{cars}}', 
    ) 
); 

В $ г, теперь я хотел бы заменить {{}} животных с другой строкой, которая хранится в отдельном массиве.

Здесь:

$translations = array(
    'animals' => array('Tiere','animaux','bestie'), 
    'cars' => array('Autos','voitures','macchine'), 
); 

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

$langId = 0; 

И теперь, взять $ г, обратите внимание на все клавиши, которые завернутые в {{}}, просмотрите их в $ translations и замените их ключом [$ langId], поэтому мы получим:

$r = array(
    0 => 'something', 
    1 => array(
     'othertext' => '1000 Tiere', 
     'anytext' => '400 Autos', 
    ) 
); 

ehm ... как это делается?

PS: маркер {{}} является случайным, может быть что-нибудь надежного

+1

Вы можете сделать preg_replace_callback(), но, возможно, сделать это до окончательного вывода строки (ов) не как они сидят в массиве. ..просто мысль. – Rasclatt

+0

Что-то вроде этого? http://stackoverflow.com/a/11174818/160968 – Urs

+0

Да, вы разобрали финальную строку и вычислили замены в функции обратного вызова – Rasclatt

ответ

2

Я был в состоянии получить выход вы ожидали, используя следующий код. Попробуйте и скажите мне, если это работает для вас или нет:

<?php 
$r = array(
    0 => 'something', 
    1 => array(
     'othertext' => '1000 {{animals}} and {{cars}}', 
     'anytext' => '400 {{cars}}', 
    ) 
); 

$translations = array(
    'animals' => array('Tiere','animaux','bestie'), 
    'cars' => array('Autos','voitures','macchine'), 
); 

$langId = 0; 
$pattern = "/\{\{[a-zA-Z]+\}\}/"; 

for($t=0; $t<count($r); $t++) { 
    $row = $r[$t]; 
    if(!is_array($row)) 
     continue; 

    foreach($row as $key=>$value) { 
    if(preg_match_all($pattern, $value, $match, PREG_SET_ORDER)) { 
     for($i = 0; $i < count($match); $i++) { 
      //remove {{ & }} to get key 
      $k = substr($match[$i][0], 2, strlen($match[$i][0])-4); 
      $replacer = $translations[$k][$langId]; 
      $value = str_replace($match[$i][0], $replacer, $value); 
      $r[$t][$key] = $value; 
     } 
    } 
    } 
} 
?> 
+0

Это работает! что вы думаете о несериализованной идее выше? – Urs

+0

Ах, нет. Попробуйте «othertext» => '1000 {{animals}} и {{cars}}', – Urs

+0

Он выведет 1000 Tiere и Tiere – Urs