循环时,用另一个数组的值替换数组的键

时间:2013-04-18 12:13:57

标签: php arrays multidimensional-array

我有两个多维数组。第一个$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 个答案:

答案 0 :(得分: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");,删除了一个级别的数组,我想这就是构建数组所需的方法。

答案 1 :(得分:0)

根据$properties$translations的结构,您可以知道这些是如何连接的。这个数组的索引如何相互匹配有点模糊,这意味着索引$properties的{​​{1}}中的值与索引0$translations的转换相同。 / p>

我只是想知道为什么0数组需要与$translations数组具有相同的结构(嵌套)。我认为$properties这个词在德语中只能表示Height。将其表示为数组表明可能存在多种翻译。

因此,如果您可以将Höhe数组缩小到一维数组,如下所示:

$translations

可能的循环是

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

(我看到每个帖子都发布了2个循环,它是$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; } } } 结构,而不是array,array,array ..)

如果你不能将转换数组缩小到一维数组,那么我只是想知道array,array数组中的每个索引是否与$properties数组中的相同索引匹配,如果是这样的话添加索引(位置)的相同技巧:

$translations

我使用过$translatedKey = $translations[$i][$i2][$key]; 因为我不确定翻译键是否始终存在。您必须自己根据要检查的内容为每个案例场景创建逻辑。

答案 2 :(得分: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

答案 3 :(得分:-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);
相关问题