it-swarm.com.de

PHP - Wie man Arrays innerhalb eines Arrays zusammenführt

Wie man n Anzahl von Arrays in PHP zusammenführt. Ich meine, wie kann ich den Job machen wie:
array_merge(from : $result[0], to : $result[count($result)-1])
ODER
array_merge_recursive(from: $result[0], to : $result[count($result) -1])


Wo $result ist ein Array mit mehreren Arrays wie folgt:

$result = Array(
0 => array(),//associative array
1 => array(),//associative array
2 => array(),//associative array
3 => array()//associative array
)

Mein Ergebnis ist:

$result = Array(
    0 => Array(
        "name" => "Name",
        "events" => 1,
        "types" => 2
    ),
    1 => Array(
        "name" => "Name",
        "events" => 1,
        "types" => 3
    ),
    2 => Array(
        "name" => "Name",
        "events" => 1,
        "types" => 4
    ),
    3 => Array(
        "name" => "Name",
        "events" => 2,
        "types" => 2
    ),
    4 => Array(
        "name" => "Name",
        "events" => 3,
        "types" => 2
    )
)

Und was ich brauche ist

$result = Array(
"name" => "name",
"events" => array(1,2,3),
"types" => array(2,3,4)
)
55
Lekhnath

array_merge kann eine variable Anzahl von Argumenten annehmen, also können Sie mit ein wenig call_user_func_array Trick Ihre $result Array dazu:

$merged = call_user_func_array('array_merge', $result);

Das läuft im Prinzip so, als hättest du Folgendes eingegeben:

$merged = array_merge($result[0], $result[1], .... $result[n]);

Aktualisieren:

Jetzt mit 5.6 haben wir die ... operator um Arrays in Argumente zu entpacken, so können Sie:

$merged = array_merge(...$result);

Und haben die gleichen Ergebnisse. *

* Das gleiche Ergebnis, solange Sie Ganzzahlschlüssel im entpackten Array haben, sonst erhalten Sie ein E_RECOVERABLE_ERROR : type 4096 -- Cannot unpack array with string keys Error.

156
complex857

Wenn du gerne möchtest:

  • stellen Sie sicher, dass jeder Parameter in array_merge tatsächlich ein Array ist
  • geben Sie eine bestimmte Eigenschaft in einem der Arrays an, nach denen zusammengeführt werden soll

Sie können diese Funktion verwenden:

function mergeArrayofArrays($array, $property = null)
{
    return array_reduce(
        (array) $array, // make sure this is an array too, or array_reduce is mad.
        function($carry, $item) use ($property) {

            $mergeOnProperty = (!$property) ?
                    $item :
                    (is_array($item) ? $item[$property] : $item->$property);

            return is_array($mergeOnProperty)
                ? array_merge($carry, $mergeOnProperty)
                : $carry;
    }, array()); // start the carry with empty array
}

Lassen Sie es uns in Aktion sehen. Hier sind einige Daten:

Einfache Struktur: Reine Anordnung von zu verschmelzenden Arrays.

$peopleByTypesSimple = [
    'teachers' => [
            0  => (object) ['name' => 'Ms. Jo', 'hair_color' => 'brown'],
            1  => (object) ['name' => 'Mr. Bob', 'hair_color' => 'red'],
    ],

    'students' => [
            0  => (object) ['name' => 'Joey', 'hair_color' => 'blonde'],
            1  => (object) ['name' => 'Anna', 'hair_color' => 'Strawberry Blonde'],
    ],

    'parents' => [
            0  => (object) ['name' => 'Mr. Howard', 'hair_color' => 'black'],
            1  => (object) ['name' => 'Ms. Wendle', 'hair_color' => 'Auburn'],
    ],
];

Weniger einfach: Array von Arrays, möchte aber die people und ignorieren die count .

$peopleByTypes = [
    'teachers' => [
        'count' => 2,
        'people' => [
            0  => (object) ['name' => 'Ms. Jo', 'hair_color' => 'brown'],
            1  => (object) ['name' => 'Mr. Bob', 'hair_color' => 'red'],
        ]
    ],

    'students' => [
        'count' => 2,
        'people' => [
            0  => (object) ['name' => 'Joey', 'hair_color' => 'blonde'],
            1  => (object) ['name' => 'Anna', 'hair_color' => 'Strawberry Blonde'],
        ]
    ],

    'parents' => [
        'count' => 2,
        'people' => [
            0  => (object) ['name' => 'Mr. Howard', 'hair_color' => 'black'],
            1  => (object) ['name' => 'Ms. Wendle', 'hair_color' => 'Auburn'],
        ]
    ],
];

Starte es

$peopleSimple = mergeArrayofArrays($peopleByTypesSimple);
$people = mergeArrayofArrays($peopleByTypes, 'people');

Ergebnisse - Beide geben Folgendes zurück:

Array
(
    [0] => stdClass Object
        (
            [name] => Ms. Jo
            [hair_color] => brown
        )

    [1] => stdClass Object
        (
            [name] => Mr. Bob
            [hair_color] => red
        )

    [2] => stdClass Object
        (
            [name] => Joey
            [hair_color] => blonde
        )

    [3] => stdClass Object
        (
            [name] => Anna
            [hair_color] => Strawberry Blonde
        )

    [4] => stdClass Object
        (
            [name] => Mr. Howard
            [hair_color] => black
        )

    [5] => stdClass Object
        (
            [name] => Ms. Wendle
            [hair_color] => Auburn
        )

)

Extra Fun: Wenn Sie eine Eigenschaft in einem Array oder Objekt wie "name" aus einem Array Personenobjekten (oder assoziierten Arrays) herausgreifen möchten, können Sie verwenden diese Funktion

function getSinglePropFromCollection($propName, $collection, $getter = true)
{
    return (empty($collection)) ? [] : array_map(function($item) use ($propName) {
        return is_array($item) 
            ? $item[$propName] 
            : ($getter) 
                ? $item->{'get' . ucwords($propName)}()
                : $item->{$propName}
    }, $collection);
}

Der Getter ist für möglicherweise geschützte/private Objekte.

$namesOnly = getSinglePropFromCollection('name', $peopleResults, false);

kehrt zurück

Array
(
    [0] => Ms. Jo
    [1] => Mr. Bob
    [2] => Joey
    [3] => Anna
    [4] => Mr. Howard
    [5] => Ms. Wendle
)
4
amurrell

Die Antwort von complex857 hat mir sehr gut gefallen, aber bei mir hat sie nicht funktioniert, da ich numerische Tasten in meinen Arrays hatte, die ich aufbewahren musste.

Ich habe das + Operator, um die Schlüssel beizubehalten (wie in PHP array_merge mit numerischen Schlüsseln vorgeschlagen) und array_reduce, um das Array zusammenzuführen.

Wenn Sie also Arrays innerhalb eines Arrays zusammenführen möchten, während die numerischen Schlüssel erhalten bleiben, können Sie dies wie folgt tun:

<?php
$a = [
    [0 => 'Test 1'],
    [0 => 'Test 2', 2 => 'foo'],
    [1 => 'Bar'],
];    

print_r(array_reduce($a, function ($carry, $item) { return $carry + $item; }, []));
?>

Ergebnis:

Array
(
    [0] => Test 1
    [2] => foo
    [1] => Bar
)
3
Friedrich

Versuche dies

$result = array_merge($array1, $array2);

Anstelle von array_merge können Sie auch die + op verwenden, die eine Vereinigung ausführt:

$array2 + array_fill_keys($array1, '');
0
Jayram