我从最近3个小时开始敲击我的头重新排列一个阵列,到目前为止没有运气。
我需要像这样重新排列这个数组:Array(A)
Array
(
[0] => Array
(
[langtext] => hello world
[mainlang] => hello world
[lang] => en
[prefix] => 1
)
[1] => Array
(
[langtext] => Bonjour le monde
[mainlang] => hello world
[lang] => fr
[prefix] => 1
)
[2] => Array
(
[langtext] => Привет мир
[mainlang] => hello world
[lang] => ru
[prefix] => 1
)
[3] => Array
(
[langtext] => provide
[mainlang] => provide
[lang] => en
[prefix] => 7
)
[4] => Array
(
[langtext] => обеспечить
[mainlang] => provide
[lang] => ru
[prefix] => 7
)
[5] => Array
(
[langtext] => fournir
[mainlang] => provide
[lang] => fr
[prefix] => 7
)
)
重新排列为:数组(B)
Array (
[prefix] => Array
(
[1] => Array
(
[en] => hello world
[mainlang] => hello world
[fr] => Bonjour le monde
[ru] => Привет мир
)
[7] => Array
(
[en] => provide
[mainlang] => provide
[fr] => fournir
[ru] => обеспечить
)
}
详情: 我需要从(A)到(B)重新排列数组," lang"键值在所有数组中都不同,其中"前缀"是一样的。
我试过foreach(但只能返回前缀作为键和任何" lang"值。
foreach (_allLangText() as $lang_array=>$key){
$lang_array_return['prefix']
[$lang_array['prefix']]=array($lang_array['lang']=>$lang_array['langtext']);
}
我得到这样的输出,这是不正确的:
Array
(
[prefix] => Array
(
[1] => Array
(
[ru] => Привет мир
)
[7] => Array
(
[fr] => fournir
)
)
最后,有可能还有更多" lang"数组中的值,我的意思是" en"," ru"," fr"或" de"如果lang中有4个不同的值,那么相同的"前缀"将在4个阵列中重复。
VAR_Export:
array (
0 =>
array (
'langtext' => 'hello world',
'mainlang' => 'hello world',
'lang' => 'en',
'prefix' => '1',
),
1 =>
array (
'langtext' => 'Bonjour le monde',
'mainlang' => 'hello world',
'lang' => 'fr',
'prefix' => '1',
),
2 =>
array (
'langtext' => 'Привет мир',
'mainlang' => 'hello world',
'lang' => 'ru',
'prefix' => '1',
),
3 =>
array (
'langtext' => 'provide',
'mainlang' => 'provide',
'lang' => 'en',
'prefix' => '7',
),
4 =>
array (
'langtext' => 'обеспечить',
'mainlang' => 'provide',
'lang' => 'ru',
'prefix' => '7',
),
5 =>
array (
'langtext' => 'fournir',
'mainlang' => 'provide',
'lang' => 'fr',
'prefix' => '7',
),
)
答案 0 :(得分:0)
一个问题是您在foreach
语法中颠倒了键和值。使用=>
时,键变量位于其前面,值变量位于其之后。无论如何,你不需要钥匙。
其次,通过为结果结构分配一个键/值对(数组),您最终无法获得多于一个键的任何键。相反,您应该分配嵌套键:
foreach (_allLangText() as $lang_array) {
$lang_array_return["prefix"][$lang_array["prefix"]][$lang_array["lang"]]
= $lang_array["langtext"];
$lang_array_return["prefix"][$lang_array["prefix"]]["mainlang"]
= $lang_array["mainlang"];
}
答案 1 :(得分:0)
问题很简单:按前缀分组元素,清除仅有翻译的分组元素。
算法很简单:
$output
(如果它尚不存在)。$output[prefix]
是否存在mainlang
密钥 - 如果没有添加已知值$output[prefix][lang]
就是这样。
这里有一个使用示例的工作解决方案:
$input = array(
array(
"langtext" => "hello world",
"mainlang" => "hello world",
"lang" => "en",
"prefix" => 1,
),
array(
"langtext" => "Bonjour le monde",
"mainlang" => "hello world",
"lang" => "fr",
"prefix" => 1,
),
array(
"langtext" => "Привет мир",
"mainlang" => "hello world",
"lang" => "ru",
"prefix" => 1,
),
array(
"langtext" => "hello world",
"mainlang" => "hello world",
"lang" => "en",
"prefix" => 1,
),
array(
"langtext" => "fournir",
"mainlang" => "provide",
"lang" => "fr",
"prefix" => 7,
),
array(
"langtext" => "обеспечить",
"mainlang" => "provide",
"lang" => "ru",
"prefix" => 7,
)
);
$output = array();
foreach($input as $translation){
if(!array_key_exists($translation["prefix"], $output))
$output[$translation["prefix"]] = array();
if(!array_key_exists("mainlang", $output[$translation["prefix"]]))
$output[$translation["prefix"]]["mainlang"] = $translation["mainlang"];
$output[$translation["prefix"]][$translation["lang"]] = $translation["langtext"];
}
现在
var_dump($output);
结果:
array(2) {
[1]=>
array(4) {
["mainlang"]=>
string(11) "hello world"
["en"]=>
string(11) "hello world"
["fr"]=>
string(16) "Bonjour le monde"
["ru"]=>
string(19) "Привет мир"
}
[7]=>
array(3) {
["mainlang"]=>
string(7) "provide"
["fr"]=>
string(7) "fournir"
["ru"]=>
string(20) "обеспечить"
}
}