2017-09-07 2 views
0

Ich hämmere meinen Kopf von den letzten 3 Stunden, um ein Array neu zu ordnen, bisher kein Glück.Rearrange Array PHP

Ich brauche dieses Array neu angeordnet sein, wie diese: 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 als: 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 Array von (A neu anordnen müssen) bis (B), "lang" Schlüsselwert sind in allen Array unterschiedlich, wo "Präfix" gleich sind. . Präfix als Schlüssel und jeder "lang" Wert zurückgeben

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

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

und ich bekomme eine Ausgabe wie diese

Ich versuchte foreach (aber nur in der Lage, die nicht korrekt ist:

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

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

Schließlich es gibt die möglichkeit, dass es mehr "lang" -Werte im Array gibt, ich meine "en", "ru", "fr" oder "de" usw. und wenn es vier verschiedene Werte in lang gibt, dann wird dasselbe "Präfix" wiederholt 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', 
    ), 
) 
+1

Könnten Sie Ergebnis von 'var_export' bieten statt' var_dump '?Es wird einfacher sein, in PHP zu kopieren und zu implementieren :) –

+0

Von einem kurzen Blick denke ich, dass Sie wollen: '$ lang_array_return ['prefix'] [$ lang_array ['prefix']] [$ lang_array ['lang']] = $ lang_array ['langtext']); 'in deiner foreach. Zumindest sollten Sie dem gewünschten Ergebnis einen Schritt näher kommen. – jh1711

+0

Ist das eine Schulhausaufgabe, liest es sich ähnlich zu anderen Schulheimarbeiten auf Stackoverflow? – Martin

Antwort

0

Ein Problem ist, dass Sie in der foreach Syntax Schlüssel und Wert umgekehrt. Wenn Sie => verwenden, kommt die Schlüsselvariable davor und die Wertvariable nach. Wie auch immer, Sie brauchen den Schlüssel nicht.

Zweitens, wenn Sie Ihrer Ergebnisstruktur ein Schlüssel/Wert-Paar (Array) zuweisen, können Sie am Ende nie mehr als einen Schlüssel erhalten. Stattdessen sollten Sie auf den verschachtelten Schlüssel zuweisen:

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

Diese Lösung funktioniert, ich war sehr geschlossen, aber meldete mich, wenn ich versuche, "Langtext" in "lang" mit Hilfe von Array hinzuzufügen. (ich hoffe, ich bin nicht falsch) :) –

0

Das Problem ist einfach: Gruppenelement durch Präfix und klar gruppierten Elemente nur Übersetzungen leben.

Algorithmus ist einfach:

  1. Für jedes Element seines Präfix nehmen und es in $output setzen, wenn es noch nicht existiert.
  2. nun prüfen, ob in $output[prefix] es mainlang Tasten- existieren, wenn es mit dem bekannten Wert
  3. Fügen Sie die Übersetzung der $output[prefix][lang] mit bekannten Wert

Das ist es nicht hinzuzufügen.

Hier haben Sie Arbeitslösung mit Beispiel Verwendung:

Und jetzt

var_dump($output); 

Ergebnisse in:

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

Erkläre deine Antwort. Wie funktioniert es. Warum funktioniert es? – Martin

+0

Es ist ziemlich einfach, würde ich sagen. Das Problem ist einfach: Gruppieren Sie die Elemente nach Präfix und reduzieren Sie gruppierte Elemente, die nur Übersetzungen enthalten. Und so mache ich in der Schleife mit zusätzlichen Prüfungen, um Fehler zu vermeiden –

+0

Meine Antwort aktualisiert –