2013-04-18 4 views
2

У меня есть два многомерных массива. Первый $properties содержит английские имена и их значения. Мой второй массив содержит переводы. ПримерЗаменить ключ массива на значение другого массива при прохождении через

$properties[] = array(array("Floor"=>"5qm")); 
$properties[] = array(array("Height"=>"10m")); 

$translations[] = array(array("Floor"=>"Boden")); 
$translations[] = array(array("Height"=>"Höhe")); 

(Они являются многогранными, поскольку содержит больше элементов, но они не должны теперь имеет значение)

Теперь я хочу, чтобы перевести этот массив, так что я ИТС в конце, как это:

$properties[] = array(array("Boden"=>"5qm")); 
$properties[] = array(array("Höhe"=>"10m")); 

мне удалось построить Еогеасп построить перебрать эти массивы, но в конце концов, это не переводится, проблема в том, как я говорю массив заменить ключ со значением.

То, что я сделал это:

//Translate Array 
foreach ($properties as $PropertyArray) { 
    //need second foreach because multidimensional array 
    foreach ($PropertyArray as $P_KiviPropertyNameKey => $P_PropertyValue) { 
     foreach ($translations as $TranslationArray) { 
      //same as above 
      foreach ($TranslationArray as $T_KiviTranslationPropertyKey => $T_KiviTranslationValue) { 
       if ($P_KiviPropertyNameKey == $T_KiviTranslationPropertyKey) { 
        //Name found, save new array key 
        $P_KiviPropertyNameKey = $T_KiviTranslationValue; 
       } 
      } 
     } 
    } 
} 

Проблемы с линией, где сохранить новый ключ:

$P_KiviPropertyNameKey = $T_KiviTranslationValue; 

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

Это так, как это должно быть сделано:

$properties[$oldkey] = $translations[$newkey]; 

Так что я попытался это одно:

$PropertyArray[$P_KiviPropertyNameKey] = $TranslationArray[$T_KiviTranslationPropertyKey]; 

Насколько я понял, выше строка должна изменить P_KiviPropertyNameKey в PropertyArray в значение Translation Array, но я не получаю никакой ошибки и не переводится имя. Как это должно быть сделано правильно?

Благодарим за помощь!

Дополнительная информация

Это живой пример массива свойств

Array 
(
    [0] => Array 
     (
      [country_id] => 4402 
     ) 

    [1] => Array 
     (
      [iv_person_phone] => 03-11 
     ) 

    [2] => Array 
     (
      [companyperson_lastname] => Kallio 
     ) 

    [3] => Array 
     (
      [rc_lot_area_m2] => 2412.7 
     ) 
    [56] => Array 
     (
      [floors] => 3 
     ) 

    [57] => Array 
     (
      [total_area_m2] => 97.0 
     ) 

    [58] => Array 
     (
      [igglo_silentsale_realty_flag] => false 
     ) 

    [59] => Array 
     (
      [possession_partition_flag] => false 
     ) 

    [60] => Array 
     (
      [charges_parkingspace] => 10 
     ) 

    [61] => Array 
     (
      [0] => Array 
       (
        [image_realtyimagetype_id] => yleiskuva 
       ) 

      [1] => Array 
       (
        [image_itemimagetype_name] => kivirealty-original 
       ) 

      [2] => Array 
       (
        [image_desc] => makuuhuone 
       ) 
     ) 
) 

И это живой пример массива переводов

Array 
(
    [0] => Array 
     (
      [addr_region_area_id] => Maakunta 
      [group] => Kohde 
     ) 

    [1] => Array 
     (
      [addr_town_area] => Kunta 
      [group] => Kohde 
     ) 

    [2] => Array 
     (
      [arable_no_flag] => Ei peltoa 
      [group] => Kohde 
     ) 

    [3] => Array 
     (
      [arableland] => Pellon kuvaus 
      [group] => Kohde 
     ) 
) 

я могу построить переводы массив по-другому. Я сделал это так, потому что на втором этапе я должен проверить, к какой группе ключи принадлежат ...

+0

Thx! Я хочу заменить ключ $ properties значением $ translations – Owl

+0

Является ли массив всегда одним ребенком глубиной? –

+0

Noo, к сожалению, нет ... Я думал, что сначала перенять первые ребята, а потом беспокоиться о втором lvl ... – Owl

ответ

0

Согласно структуре $properties и $translations, вы как-то знаете, как они связаны между собой. Немного туманно, как индексы массива соответствуют друг другу, то есть значения в $properties по индексу 0 являются эквивалентом для перевода в $translations по индексу 0.

Мне просто интересно, почему массив $translations должен иметь такую ​​же структуру (в гнездовании), как массив $properties. На мой взгляд, слово Height может означать только Höhe на немецком языке. Представление его в виде массива предполагает наличие нескольких переводов.

Так что, если вы могли бы сузить $translations массив в одномерный массив, как в:

$translation = array(
    "Height"=>"Höhe", 
    "Floor"=>"Boden" 
); 

возможный цикл будет

$result = array(); 

foreach($properties as $i => $array2) { 
    foreach($array2 as $i2 => $array3) { 
    foreach($array3 as $key => $value) { 
     $translatedKey = array_key_exists($key, $translations) ? 
     $translations[$key]: 
     $key; 
     $result[$i][$i2][$translatedKey] = $value; 
    } 
    } 
} 

(я вижу каждое тело размещение 2 петли, это a array,array,array структура, а не array,array ..)

Если вы не можете сузить матрицу переводов до одномерного массива, м просто интересно, если каждый индекс в $properties массиве совпадает с тем же индексом в массиве $translations, если так это тот же трюк, добавив индексов (местоположение):

$translatedKey = $translations[$i][$i2][$key]; 

Я использовал array_key_exists, потому что я не убедитесь, что всегда присутствует ключ перевода. Вы должны сами создать логику для каждого сценария, чтобы проверить или нет.

+0

Спасибо всем! Я считаю, что я действительно сделал это слишком сложно. Как вы предположили, лучше сделать 3 одномерных массива, сначала перевести первый массив, а затем сравнить его с группами (группы не были упомянуты в примере) – Owl

2

Try это:

$properties  = array(); 
$translations = array(); 

$properties[] = array("Floor"=>"5qm"); 
$properties[] = array("Height"=>"10m"); 

$translations[] = array("Floor"=>"Boden"); 
$translations[] = array("Height"=>"Höhe"); 

$temp   = call_user_func_array('array_merge_recursive', $translations); 

$result   = array(); 
foreach($properties as $key=>$val){ 
    foreach($val as $k=>$v){ 
     $result[$key][$temp[$k]] = $v; 
    } 
} 

echo "<pre>"; 
print_r($result); 

выход:

Array 
(
    [0] => Array 
     (
      [Boden] => 5qm 
     ) 

    [1] => Array 
     (
      [Höhe] => 10m 
     ) 

) 

Пожалуйста note: Я изменил массив на $properties[] = array("Floor"=>"5qm");, убрал уровень массива, я думаю, именно так вам нужно структурировать массив.

+0

Спасибо вам, отлично работает в вашем примере, но, к сожалению, массивы многомерны. Я мог бы, вероятно, отвлечь их, сделать из группы третий массив, но важно, чтобы его наиболее эффективный способ справиться с этим, потому что он об огромном XML-файле. Как я могу перевести ваш пример в мой? – Owl

+0

У ТС есть более одного ребенка. –

+0

В моем ответе arays alredy two dimension ... Почему именно вам нужно, чтобы он был мульти? –

-1

Вы должны сделать цикл for таким образом. Если я понял вас правильно (т.е.e) в ассоциативном массиве первый ключ такой же (некоторый индекс).

foreach($properties as $key => $values) { 
    foreach($values as $key1 => $value1) { 
     $propertyResult[] = array($translations[$key][$key1][$value1] => $properties[$key][$key1][$value1]); 
    } 
} 

print_r($propertyResult); 
+0

'$ values' даст вам' array (array ("Floor" => "5qm")) ',' $ values1 'даст вам массив (« Floor »=>« 5qm »)', используя '$ value1', как в' $ translations [$ key] [$ key1] [$ value1] 'будет вызывать предупреждение' Тип незаконного смещения' , Если вы публикуете комментарий к OP, говорящий _do какой-то ответ, или иначе не отправляйте вопросы_, тогда, пожалуйста, сделайте следующий достойный действительный код в следующий раз. – dbf

+1

@dbf: просто закройте и идите. –

+0

@dbf: У вас нет глаз. См. Код правильно. Это не $ values1, это значение $ value1. Откройте глаза lyk f - король и посмотрите правильно. –

0

Это полностью рекурсивный способ сделать это.

/* input */ 
$properties[] = array(array("Floor"=>"5qm", array("Test"=>"123"))); 
$properties[] = array(array("Height"=>"10m")); 

$translations[] = array(array("Floor"=>"Boden", array("Test"=>"Foo"))); 
$translations[] = array(array("Height"=>"Höhe")); 


function array_flip_recursive($arr) { 
    foreach ($arr as $key => $val) { 
     if (is_array($val)) { 
      $arr[$key] = array_flip_recursive($val); 
     } 
     else { 
      $arr = @array_flip($arr); 
     } 
    } 
    return $arr; 
} 

function array_merge_it($arr) { 
    foreach ($arr as $key => $val) { 
     if (is_array($val)) { 
      $arr[$key] = array_merge_it($val); 
     } else { 
      if(isset($arr[$key]) && !empty($arr[$key])) { 
       @$arr[$key] = $arr[$val]; 
      } 
     } 
    } 
    return $arr; 
} 

function array_delete_empty($arr) { 
    foreach ($arr as $key => $val) { 
     if (is_array($val)) { 
      $arr[$key] = array_delete_empty($val); 
     } 
     else { 
      if(empty($arr[$key])) { 
      unset($arr[$key]); 
      } 
     } 
    } 
    return $arr; 
} 



$arr = array_replace_recursive($properties, $translations); 
$arr = array_flip_recursive($arr); 
$arr = array_replace_recursive($arr, $properties); 
$arr = array_merge_it($arr); 
$arr = array_delete_empty($arr); 

print_r($arr); 

http://sandbox.onlinephpfunctions.com/code/d2f92605b609b9739964ece9a4d8f389be4a7b81

Смежные вопросы