2017-06-29 2 views
1

i Array folgende. und ich möchte dieses Array dynamisch aktualisieren.convert Array um assoziative Array

Array 
(
[0] => Array 
    (
     [id] => 
     [cip] => 172.35.2.45 
     [ctime] => 1498718978 
     [uip] => 172.35.2.40 
     [utime] => 1498712478 
     [interface] => wan 
     [type] => pass 
     [disabled] => no 
    ) 
[1] => Array 
    (
     [id] => 
     [cip] => 172.35.2.24 
     [ctime] => 1498778578 
     [uip] => 172.35.2.41 
     [utime] => 1498532478 
     [interface] => wan 
     [type] => pass 
     [disabled] => no 
    ) 
) 

und ich möchte es in konvertieren.

Array 
(
[0] => Array 
    (
     [id] => 
     updated => Array 
     (
      [time] => 1498712478 
      [username] => [email protected] 
     ) 
     created => Array 
     (
      [time] => 1498712478 
      [username] => [email protected] 
     ) 
     [interface] => wan 
     [type] => pass 
     [disabled] => no 
    ) 
[1] => Array 
    (
     [id] => 
     [updated] => Array 
     (
      [time] => 1498532478 
      [username] => [email protected] 
     ) 
     created => Array 
     (
      [time] => 1498778578 
      [username] => [email protected] 
     ) 
     [interface] => wan 
     [type] => pass 
     [disabled] => no 
    ) 
) 

wir hier in Haupt Array mit zwei Elementen haben, und es kann sehr, habe ich versucht, es durch foreach-Schleife und eine andere Sache verwenden. aber ich bin nicht in der Nähe der Antwort, die ich will, bitte helfen Sie mir, das zu sortieren

Antwort

0

Dargestellt würde ich meinen Kommentar in eine Antwort konvertieren, weil es lang und widerspenstig ohne richtige Einrückung war. $array1 ist Original-Array

$array2['id'] = $array1['id']; 
$array2['updated'] = ['time'  => $array1['utime'], 
         'username' => '[email protected]'.$array1['uip']]; 
$array2['created'] = ['time'  => $array1['ctime'], 
         'username' => '[email protected]'.$array1['cip']]; 
$array2['interface'] = $array1['interface']; 
$array2['type'] = $array1['type']; 
$array2['disabled'] = $array1['disabled']; 

Diese im Grunde geht nur Zeile für Zeile für Ihre zweite Array und legt die Array-Elemente richtig die Frage nach.

Ich bin sicher, es gibt eine Möglichkeit, zu automatisieren, was Sie tun möchten, so dass Sie nicht Zeile für Zeile gehen müssen, aber ehrlich gesagt ist jede Antwort, die diesen Schritt automatisiert, zu viel Zeit und würde sicherlich mehr Zeit in Anspruch nehmen Prozess als das.

0

Short Lösung array_combine und unset Funktionen:

// $arr is your initial array 
$arr['updated'] = array_combine(['time', 'username'], [$arr['utime'], '[email protected]' . $arr['uip']]); 
$arr['created'] = array_combine(['time', 'username'], [$arr['ctime'], '[email protected]' . $arr['cip']]); 
unset($arr['utime'], $arr['ctime'], $arr['uip'], $arr['cip']); 

print_r($arr); 

Der Ausgang:

Array 
(
    [id] => 
    [interface] => wan 
    [type] => pass 
    [disabled] => no 
    [updated] => Array 
     (
      [time] => 1498712478 
      [username] => [email protected] 
     ) 

    [created] => Array 
     (
      [time] => 1498718978 
      [username] => [email protected] 
     ) 
) 
0

Ich denke, die sauberste Option so sein würde:

$array2 = [ 
     'id => '', 
     'updated' => [ 
      'time' => $array1['utime'], 
      'username' => $array1['username'] 
     ], 
     'created' => [ 
      'time' => $array1['ctime'], 
      'username' => $array1['username'] 
     ], 
     'interface' => $array1['wan'], 
     'type' => $array1['pass'], 
     'disabled' => $array1['no'] 
    ] 
]; 

Sie nicht taten State PHP-Version, so dass ich eckige Klammern verwendet, um Arrays zu starten, wenn Sie noch an sind weniger als 7 müssen Sie alle eckigen Klammern für array() austauschen;

0

Ich nahm an, dass Sie mehr als einen Eintrag in Ihrem Startarray haben würden und das resultierende Array aus dem größeren Anfangsarray bauen wollten, also habe ich es durch eine Schleife gelegt.

$array1[] = array(
     'id' => '', 
     'cip' => '172.35.2.45', 
     'ctime' => 1498718978, 
     'uip' => '172.35.2.40', 
     'utime' => 1498712478, 
     'interface' => 'wan', 
     'type' => 'pass', 
     'disabled' => 'no' 
    ); 

$array2 = array(); 
$directkeys = array('id', 'interface', 'type', 'disabled'); 
foreach ($array1 as $mk => $subarray){ 
    foreach($subarray as $k => $v){ 
     if(in_array($k, $directkeys)) $array2[$mk][$k] = $v; 
     if($k == 'uip') $array2[$mk]['id']['updated']['username'] = '[email protected]'.$v; 
     if($k == 'utime') $array2[$mk]['id']['updated']['time'] = $v; 
     if($k == 'cip') $array2[$mk]['id']['created']['username'] = '[email protected]'.$v; 
     if($k == 'ctime') $array2[$mk]['id']['created']['time'] = $v;  
    } 
} 

Ausgang ist:

[0] => Array 
    (
     [id] => Array 
      (
       [created] => Array 
        (
         [username] => [email protected] 
         [time] => 1498718978 
        ) 

       [updated] => Array 
        (
         [username] => [email protected] 
         [time] => 1498712478 
        ) 

      ) 

     [interface] => wan 
     [type] => pass 
     [disabled] => no 
    ) 
+0

Sie könnten eine Leistungseinbuße bekommen, indem Sie if() {} elseif() {} Struktur statt der Reihe von ifs verwenden, die ich hier zusammenwarf – Dano

0

es, indem Sie dies getan worden ist.