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"));

我已经设法构建了 foreach 结构来循环遍历这些数组,但最后它没有被翻译,问题是,我如何告诉数组用值替换键。

我所做的是这样的:

//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];

据我了解,上述行应该将 PropertyArray 的 P_KiviPropertyNameKey 更改为 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
        )
)

我可以用另一种方式构建翻译数组。我这样做是因为在第二步中我必须检查密钥属于哪个组...

4

4 回答 4

2

试试这个 :

$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
        )

)

请注意:我将数组更改为$properties[] = array("Floor"=>"5qm");,删除了一级数组,我想这就是您需要构造数组的方式。

于 2013-04-18T12:33:22.683 回答
0

根据 和 的结构$properties$translations你就知道它们是如何联系起来的了。数组的索引如何相互匹配有点模糊,这意味着 at index 中的值与$propertiesat index中0的翻译等效。$translations0

我只是想知道为什么$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 个循环,这是一个array,array,array结构,而不是array,array..)

如果您不能将翻译数组缩小为一维数组,那么我只是想知道数组中的每个索引是否与$properties数组中的相同索引匹配$translations,如果是这样,通过添加索引(位置)是相同的技巧:

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

我使用过array_key_exists是因为我不确定翻译键是否总是存在。您必须自己为每个案例场景创建逻辑,以确定要检查或不检查的内容。

于 2013-04-18T13:03:35.687 回答
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

于 2013-04-18T13:24:03.897 回答
-1

您必须以这种方式执行 for 循环。如果我理解你的正确(即)关联数组中的第一个键是相同的(一些索引)。

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

print_r($propertyResult);
于 2013-04-18T12:34:54.940 回答