我有两个多维数组。第一个$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
)
)
我可以用另一种方式构建翻译数组。我是这样做的,因为在第二步中我必须检查,键属于哪个组......
答案 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);