phparraysmultidimensional-arraygroupingassociative-array

Group 2d array data by a column and create associative elements within each group


I banging my head from last 3 hours to rearrange a array, so far no luck.

I need this array to be rearrange like this: 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
    )
)

Rearrange as: Array (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] => обеспечить
            )
 }

Detail: I need to rearrange array from (A) to (B), "lang" key value are different in all array where "prefix" are same.

I tried foreach (but only able to return prefix as key and any "lang" value.

foreach (_allLangText() as $lang_array=>$key){

$lang_array_return['prefix']
[$lang_array['prefix']]=array($lang_array['lang']=>$lang_array['langtext']);
  }

And i get output like this, which is incorrect:

Array
   (
     [prefix] => Array
    (
        [1] => Array
            (
                [ru] => Привет мир
            )

        [7] => Array
            (
                [fr] => fournir
            )
 )

Finally, there is possibility that there is more "lang" value in array, I mean "en","ru","fr" or "de" etc. and if there is 4 different value in lang then same "prefix" will repeat in 4 arrays.

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',
    ),
  )

Solution

  • One issue is that you reversed key and value in the foreach syntax. When you use =>, the key variable comes before it, and the value variable after. Any way, you don't need the key.

    Secondly, by assigning one key/value pair (array) to your result structure, you can never get anything more than one key assigned in the end. Instead, you should assign to the nested key:

    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"];
    }