重新排列数组PHP

时间:2017-09-07 20:46:22

标签: php arrays

我从最近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',
    ),
  )

2 个答案:

答案 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)

问题很简单:按前缀分组元素,清除仅有翻译的分组元素。

算法很简单:

  1. 对于每个元素,取其前缀并将其放入$output(如果它尚不存在)。
  2. 现在检查$output[prefix]是否存在mainlang密钥 - 如果没有添加已知值
  3. 将翻译添加到具有已知值的$output[prefix][lang]
  4. 就是这样。

    这里有一个使用示例的工作解决方案:

    $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) "обеспечить"
      }
    }