【问题标题】:Replace key of array with the value of another array while looping through循环时用另一个数组的值替换数组的键
【发布时间】:2013-04-18 12:13:56
【问题描述】:

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

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

【问题讨论】:

  • 谢谢!我想用 $translations 的值替换 $properties 的键
  • 数组总是只有一个子深度吗?
  • Noo 很遗憾没有...我想先翻译第一个孩子,然后再担心第二个 lvl...
  • @Kaktus,只是出于兴趣,您能否举例说明分配给$properties[]完整 数组的结构如何?因为array,array,array 在我看来有点模棱两可。第二,$translations 数组的结构怎么和$properties 数组一样?有一个基于键的翻译数组不是更容易吗?
  • 我添加了一个实时示例...示例中的键名不匹配,因为我只取了一小部分,但它们在真实数组中匹配...你是什么意思 拥有一个基于密钥的翻译数组不是更容易吗?我很想听听任何能让这更容易的事情!

标签: php arrays multidimensional-array


【解决方案1】:

试试这个:

$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"=&gt;"5qm");,删除了一级数组,我想这就是您需要构造数组的方式。

【讨论】:

  • 谢谢它在你的例子中运行良好,但不幸的是数组是多维的。我可能会转移它们,使组成为第三个数组,但重要的是它是最有效的处理方式这是因为它关于一个巨大的 xml 文件。我怎样才能把你的例子翻译成我的?
  • TS 有不止一个孩子。
  • 在我的回答中,数组已经是二维的......为什么你需要它是多维的?
  • 哇,你的权利,我工作!我很感激!但是我收到了一些错误,我相信有几行没有任何翻译。两次Notice: Undefined index:(我相信这是两个缺少翻译)和一次Warning: Illegal offset type ..这个我不明白。 (所有错误参考$result[$key][$temp[$k]] = $v; 行。)
  • hmmmm...如果没有翻译会报错,我们可以通过检查array_key_exists来消除这个错误,但是不会显示对应的值,最好加上翻译值。
【解决方案2】:

根据$properties$translations 的结构,你不知怎么知道它们是如何联系起来的。数组的索引如何相互匹配有点模糊,这意味着索引 0 处的 $properties 中的值与索引 0 处的 $translations 中的转换等效。

我只是想知道为什么$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,因为我不确定翻译键是否始终存在。您必须自己为每个案例场景创建逻辑,以确定要检查的内容。

【讨论】:

  • 非常感谢大家!我相信我真的把它弄得太复杂了。正如您所建议的,最好制作 3 个一维数组,首先转换第一个数组,然后将其与组进行比较(示例中未提及组)
【解决方案3】:

这是一种完全递归的方式。

 /* 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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • $values 会给你array(array("Floor"=&gt;"5qm"))$values1 会给你array("Floor"=&gt;"5qm"),在$translations[$key][$key1][$value1] 中使用$value1 会抛出一个警告Illegal offset type。如果您向 OP 发表评论说做一些回应或者不要发布问题,那么请在下次发布一些体面的有效代码。
    • @dbf:你没有眼睛。正确查看代码。它不是 $values1,而是 $value1。睁开你的眼睛 lyk f--king 并正确地看到它..
    • 作为你我也会讨厌这个世界。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多