2017-10-10 5 views
-1

I 2-Arrays in PHP7 haben:PHP7: zwei Arrays kombinieren, wobei ein Schlüssel ist, und das zweite ist Wert (integer), Summenwerte für Nachschlüssel

$Array1 = ["bus","bus","int"]; 
$Array2 = [2,18,10]; 

Wo $ Array1 ist Schlüssel und $ Array2 ist Wert für jeden Index.
Ich muss beide und Summe Werte für doppelte Schlüssel, z. folgende Ausgabe erhalten:

$Array3 = ["bus" => 20, "int" => 10]; 

Vielen Dank!

+0

Wenn es keine doppelten Schlüssel sind dann können Sie mit [ 'array_combine()'] (http: // PHP. net/manual/de/function.array-combine.php). Wenn es doppelte Schlüssel gibt, ist ['array_map()'] (http://php.net/manual/en/function.array-map.php) eine mögliche Lösung. In beiden Fällen kann auch eine einfache "foreach" -Schleife ausgeführt werden. Hast du etwas versucht? – axiac

Antwort

1

Der Code, den Sie benötigen, ist so einfach:

// The input arrays 
$Array1 = ['bus', 'bus', 'int']; 
$Array2 = [2, 18, 10]; 

// Build the result here 
$Array3 = []; 

// There is no validation, the code assumes that $Array2 contains 
// the same number of items as $Array1 or more 
foreach ($Array1 as $index => $key) { 
    // If the key $key was not encountered yet then add it to the result 
    if (! array_key_exists($key, $Array3)) { 
     $Array3[$key] = 0; 
    } 

    // Add the value associate with $key to the sum in the results array 
    $Array3[$key] += $Array2[$index]; 
} 

print_r($Array3); 

Sein Ausgang:

Array 
(
    [bus] => 20 
    [int] => 10 
) 
+0

Danke Axiac, das ist genau das, was ich gesucht habe! Perfekt! – Aleksey

-1

ich werde es schaffen. Ich hoffe, es wird hilfreich für Sie sein: Sie können Ihre benötigten out setzen, indem Sie ein zusätzliches Array, vor allem, zählen Sie Ihre Array-Elemente, das werden Sie konditionieren. diese einfache Überprüfung

$Array1[$x] == $Array1[$x+1] 

wird überprüft, ob die Array fortlaufende Adresse den gleichen Wert haben. (Die Bedingung ist, Array muss sortiert werden),

und der andere Wert wie folgt:

$arr[$Array1[$x]] // assign a key 

dies ist dafür assoziiertes Array Herstellung:

$Array1 = ["bus","bus","int"]; 
$Array2 = [2,18,10]; 

$arr = []; 

for ($x = 0; $x < count($Array1); $x++) { 
    if($Array1[$x] == $Array1[$x+1]) 
    { 
     $arr[$Array1[$x]] = $Array2[$x] + $Array2[$x+1]; 
     $x++; 
    } 
    else 
    { 
    $arr[$Array1[$x]] = $Array2[$x]; 
    } 

} 

die Ausgabe ist:

Array ([bus] => 20 [int] => 10) 
+0

Vielen Dank für dieses Code-Snippet, das Ihnen sofortige Hilfe bieten kann. Eine gute Erklärung [würde erheblich verbessern] (https://meta.stackexchange.com/q/114762) ihren pädagogischen Wert, indem sie zeigt, warum dies eine gute Lösung für das Problem ist, und es für zukünftige Leser mit ähnlichen aber nicht identisch, Fragen. Bitte bearbeiten Sie Ihre Antwort, um eine Erläuterung hinzuzufügen, und geben Sie an, welche Einschränkungen und Annahmen gelten. – GrumpyCrouton

+0

Dieser Code funktioniert nur, wenn die identischen Schlüssel nebeneinander liegen. Außerdem ist '$ Array1 [$ x + 1]' kein gültiger Index in der letzten Iteration der Schleife. – SirDarius

+0

Array muss sortiert werden –

0

Dieses könnte funktionieren:

$Array1 = ['bus', 'bus', 'int']; 
$Array2 = [2, 18, 10]; 

# Let $Array3 be the required results array. 
$Array3 = []; 
for($j = 0; $j < count($Array1); $j += 1){ 
    $k = $Array1[$j]; 
    /*If the key already exists in $Array3 , add to it the value in the present key, 
    else just enter it as a new element. */ 
if(array_key_exists($k,$Array3)){ $Array3[$k] = $Array3[$k] + $Array2[$j];} 
    else { 
# But first check that the length of $Array2 is not exceeded 
    if($j <= count($Array2)){ 
    $Array3[$k] = $Array2[$j]; 
      } 
     } 
} 

print_r($Array3); 

     # gives: Array ([bus] => 20 [int] => 10) 
+0

Hallo John, vielen Dank für die schnelle Antwort! In meinem Fall haben sowohl Array1 als auch Array2 standardmäßig dieselbe Länge, also ging ich mit Code von @axiac, aber deine Lösung funktioniert perfekt. Insbesondere wenn die Längenvalidierung benötigt wird. Danke vielmals. – Aleksey

Verwandte Themen