Ich habe ein Array, das ich versuche, alle Unterwerte mit demselben Schlüsselnamen zu kombinieren und ein zusätzliches hinzuzufügen, wenn es nur 2 mit demselben Schlüsselnamen gibt.

Dies ist ein Beispiel für das Array, das dieses Array mit 92 Zeilen enthält

Array
(
    [0] => Array ( 
            [N_127y4Gral] => Array ( 
                    [0] => 302
                )
        )
    [1] => Array ( 
            [N_127y4Gral] => Array ( 
                    [0] => 288
                )
        )
    [2] => Array ( 
            [N_144y4Gral] => Array ( 
                    [0] => 317
                )
        )
    [3] => Array ( 
            [N_144y4Gral] => Array ( 
                    [0] => 307
                )
        )
    [4] => Array ( 
            [N_144y4Gral] => Array ( 
                    [0] => 332
                )
        )
)

Und das ist die Ausgabe, die ich suche.

Array
(
    [0] => Array ( 
            [N_127y4Gral] => Array ( 
                    [0] => 302
                    [1] => 288
                    [2] => 0
                )
        )
    [1] => Array ( 
            [N_144y4Gral] => Array ( 
                    [0] => 317
                    [1] => 307
                    [2] => 332
                )
        )
)

Ich denke, ich muss eine foreach- oder for-Schleife verwenden, um dies zu erreichen, aber ich bin mir nicht sicher, wie ich die Funktion strukturieren soll. Jeder Vorschlag wird sehr geschätzt.

-2
Alex Welander 17 Jän. 2019 im 22:10

4 Antworten

Beste Antwort

Wenn Sie das Array und das erstellende und assoziative Array in einer Schleife ausführen und jeweils die maximale Anzahl der Arrays beibehalten, können Sie das Ergebnisarray so ändern, dass die Array-Füllung es als Referenz durchläuft.

foreach($arr as $sub){
    foreach($sub as $key => $val){
        $res[$key][] = $val[0];
        if(!isset($count[$key])){
            $count[$key] = 1;
        }else{
            $count[$key]++;
        }
    }
}
$max = max($count);
foreach($res as &$subarray){
    $subarray = array_merge($subarray, array_fill(0,$max-count($subarray), 0));
}
var_dump($res);

Ausgabe davon:

array(2) {
  ["N_127y4Gral"]=>
  array(3) {
    [0]=>
    string(3) "302"
    [1]=>
    string(3) "288"
    [2]=>
    int(0)
  }
  ["N_144y4Gral"]=>
  &array(3) {
    [0]=>
    string(3) "317"
    [1]=>
    string(3) "307"
    [2]=>
    string(3) "332"
  }
}

https://3v4l.org/WHWYg

0
Andreas 17 Jän. 2019 im 19:54
$result = [];
foreach ($data as $row) {
    foreach ($row as $key => $val) {
        $result[$key][] = $val[0];
    }
}

print_r($result);
0
Alex 17 Jän. 2019 im 19:34

Überprüfen Sie diese Schleife: https://rextester.com/GOGA85799

 foreach($old_array as $key=>$value){
       $temp_key="";

       foreach($value as $okey=>$ovalue){
           echo $okey;
           echo $temp_key;
           if($okey!=$temp_key){
               echo "changed";
               $new_array[$okey][]=$ovalue[0];

           }
            $temp_key=$okey;

       }
   }
0
user3742005 17 Jän. 2019 im 19:54

Sie können array_walk verwenden, um jedes Element zu iterieren und die Werte in ein anderes Array zu extrahieren / kopieren, da Sie einen einzelnen Wert unter dem Schlüsselnamen haben. Außerdem möchten Sie für diese ein 0 hinzufügen Indizes, bei denen die Anzahl der Werte geringer ist als im Vergleich zum anderen Unterindex, können Sie zu diesem Zweck array_pad verwenden (siehe unten)

$arr = [
    [
        'N_127y4Gral' => [302]
    ],
    [
        'N_127y4Gral' => [288]
    ],
    [
        'N_144y4Gral' => [317]
    ],
    [
        'N_144y4Gral' => [307]
    ],
    [
        'N_144y4Gral' => [332]
    ]
];

$newArr = [];

//walk array and get the values into another 
//array according to the desired format
array_walk(
    $arr,
    function ($val, $index) use (&$newArr) {
        $newArr[key($val)][] = $val[key($val)][0];
    }
);

//get the array key names
$keys = array_keys($newArr);

//iterate all key names 
foreach ($keys as $key => $keyName) {

    //check the array size if smaller than 3
    if (sizeof($newArr[$keyName]) < 3) {

        //add 0 for the missing indexes
        $newArr[$keyName] = array_pad($newArr[$keyName], 3, 0);
    }
}

print_r($newArr);

Das Obige gibt das folgende Array aus

Array
(
    [N_127y4Gral] => Array
        (
            [0] => 302
            [1] => 288
            [2] => 0
        )

    [N_144y4Gral] => Array
        (
            [0] => 317
            [1] => 307
            [2] => 332
        )

)
0
Muhammad Omer Aslam 17 Jän. 2019 im 19:59