سؤال

لدي مجموعتان من الحيوانات (على سبيل المثال).

$array = array(
    array(
        'id' => 1,
        'name' => 'Cat',
    ),
    array(
        'id' => 2,
        'name' => 'Mouse',
    )
);

$array2 = array(
    array(
        'id' => 2,
        'age' => 321,
    ),
    array(
        'id' => 1,
        'age' => 123,
    )
);

كيف يمكنني دمج الصفيفين في واحد بواسطة المعرف؟

هل كانت مفيدة؟

المحلول

هذا يفعل ما اقترحه إريك (رقم التعريف.كمفتاح صفيف) ويدمج vlaues في $array2 ل $results.

$results = array();

foreach($array as $subarray)
{
    $results[$subarray['id']] = array('name' => $subarray['name']);
}

foreach($array2 as $subarray)
{
    if(array_key_exists($subarray['id'], $results))
    {
        // Loop through $subarray would go here if you have extra 
        $results[$subarray['id']]['age'] = $subarray['age'];
    }
}

نصائح أخرى

@ آندي

http://se.php.net/array_merge

كانت هذه هي فكرتي الأولى، لكنها لم تنجح تمامًا array_merge_recursive قد تنجح - كسول جدًا للتحقق الآن.

أولاً، لماذا لا تستخدم المعرف كفهرس (أو مفتاح، في مصفوفة نمط التعيين التي تكون مصفوفات php هي imo)؟

$array = array(
    1 => array(
        'name' => 'Cat',
    ),
    2 => array(
        'name' => 'Mouse',
    )
);

بعد ذلك سيتعين عليك البحث خلال مصفوفة واحدة، وإجراء array_merge على عناصر المصفوفة الأخرى:

foreach($array2 as $key=>$value) {
  if(!is_array($array[$key])) $array[$key] = $value;
  else $array[$key] = array_merge($array[key], $value); 
}

شيء من هذا القبيل على الأقل.ربما هناك حل أفضل؟

<?php
      $a = array('a' => '1', 'b' => array('t' => '4', 'g' => array('e' => '8')));
      $b = array('c' => '3', 'b' => array('0' => '4', 'g' => array('h' => '5', 'v' => '9')));
      $c = array_merge_recursive($a, $b);
      print_r($c);
?>

array_merge_recursive — دمج صفيفتين أو أكثر بشكل متكرر

المخرجات:

        Array
(
    [a] => 1
    [b] => Array
        (
            [t] => 4
            [g] => Array
                (
                    [e] => 8
                    [h] => 5
                    [v] => 9
                )

            [0] => 4
        )

    [c] => 3
)

@ آندي

لقد نظرت بالفعل إلى ذلك ولم أر كيف يمكن أن يساعد في دمج المصفوفات متعددة الأبعاد.ربما يمكنك أن تعطي مثالا.

@كيفن

ربما هذا هو ما سأحتاج إلى القيام به لأنني أعتقد أن الكود أدناه سيكون بطيئًا جدًا.يختلف الرمز الفعلي بعض الشيء لأنني أستخدم ADOdb (و ODBC للاستعلام الآخر) ولكني سأجعله يعمل وأنشر إجابتي الخاصة.

يعمل هذا، ولكن أعتقد أنه سيكون بطيئًا جدًا لأنه يمر عبر الحلقة الثانية في كل مرة:

foreach($array as &$animal)
{
    foreach($array2 as $animal2)
    {
        if($animal['id'] === $animal2['id'])
        {
            $animal = array_merge($animal, $animal2);
            break;
        }
    }
}
foreach ($array as $a)
    $new_array[$a['id']]['name'] = $a['name'];

foreach ($array2 as $a)
    $new_array[$a['id']]['age'] = $a['age'];

وهذه هي النتيجة:

    [1] => Array
        (
            [name] => Cat
            [age] => 123
        )

    [2] => Array
        (
            [name] => Mouse
            [age] => 321
        )
<?php
$array1 = array("color" => "red", 2, 4);
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2);
print_r($result);
?>

باستخدام PHP 5.3، يمكنك إجراء هذا النوع من الدمج باستخدام array_replace_recursive()

http://www.php.net/manual/en/function.array-replace-recursive.php

يجب أن تبدو المصفوفة الناتجة كما يلي:

Array (
    [0] => Array
        (
            [id] => 2
            [name] => Cat
            [age] => 321
        )

    [1] => Array
        (
            [id] => 1
            [name] => Mouse
            [age] => 123
        )
)

وهو ما أعتقد أنك أردت نتيجة لذلك.

أفضل ذلك array_splice زيادة array_merge بسبب مشكلات الأداء، سيكون الحل الخاص بي هو:

<?php 
array_splice($array1,count($array1),0,$array2);
?>
$new = array();
foreach ($array as $arr) {
    $match = false;
    foreach ($array2 as $arr2) {
        if ($arr['id'] == $arr2['id']) {
           $match = true;
           $new[] = array_merge($arr, $arr2);
           break;
        }
    }
    if ( !$match ) $new[] = $arr;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top