PHP दो साहचर्य सरणियों को एक सरणी में जोड़ती है


85
$array1 = array("$name1" => "$id1");

$array2 = array("$name2" => "$id2", "$name3" => "$id3");

मुझे एक साथ मिलकर एक नई सरणी की आवश्यकता है, अर्थात यह होगा

$array3 = array("$name1" => "$id1", "$name2" => "$id2", "$name3" => "$id3");

इसे करने का बेहतरीन तरीका क्या है?

क्षमा करें, मैं भूल गया, आईडी एक-दूसरे से कभी मेल नहीं खाएंगे, लेकिन तकनीकी रूप से नाम हो सकते हैं, फिर भी संभावना नहीं होगी, और इन सभी को एक सरणी में सूचीबद्ध करने की आवश्यकता है। मैंने array_merge को देखा, लेकिन यकीन नहीं था कि ऐसा करने का सबसे अच्छा तरीका था। इसके अलावा, आप इसे कैसे परखेंगे?


5
लगता है कि आप शायद array_merge की तलाश में हैं।
कॉर्बिन

मुझे लगता है कि सबसे अच्छा तरीका है, अगर आपको पता है कि चाबियाँ सभी भिन्न हैं, तो + = ऑपरेटर का उपयोग करना है: $ array1 + = $ array2; यह $ array2 के सभी तत्वों को $ array1 के अंत में जोड़ देता है।
डेविड स्पेक्टर

जवाबों:


127

array_merge() अधिक कुशल है लेकिन विकल्पों में से कुछ हैं:

$array1 = array("id1" => "value1");

$array2 = array("id2" => "value2", "id3" => "value3", "id4" => "value4");

$array3 = array_merge($array1, $array2/*, $arrayN, $arrayN*/);
$array4 = $array1 + $array2;

echo '<pre>';
var_dump($array3);
var_dump($array4);
echo '</pre>';


// Results:
    array(4) {
      ["id1"]=>
      string(6) "value1"
      ["id2"]=>
      string(6) "value2"
      ["id3"]=>
      string(6) "value3"
      ["id4"]=>
      string(6) "value4"
    }
    array(4) {
      ["id1"]=>
      string(6) "value1"
      ["id2"]=>
      string(6) "value2"
      ["id3"]=>
      string(6) "value3"
      ["id4"]=>
      string(6) "value4"
    }

7
ऑपरेटर के उपयोग से array_merge का क्या लाभ है?
जेस्ट्मैन नोव

37
Array Union (+): + ऑपरेटर दायें हाथ के एरे से शेष कुंजियों के तत्वों को बायें हाथ में रखता है, जबकि डुप्लिकेट कीज़ को अधिलेखित नहीं किया जाता है। array_merge (): यदि इनपुट सरणियों में समान स्ट्रिंग कुंजियाँ हैं, तो उस कुंजी के लिए बाद का मान पिछले वाले को अधिलेखित कर देगा। यदि, हालांकि, सरणियों में संख्यात्मक कुंजियाँ होती हैं, तो बाद के मूल्य मूल मूल्य को अधिलेखित नहीं करेंगे, लेकिन संलग्न किए जाएंगे। यदि सभी सरणियों में केवल संख्यात्मक कुंजियाँ होती हैं, तो परिणामी सरणी को शून्य से शुरू होने वाली वेतन वृद्धि की कुंजी दी जाती है।
शमूएल कुक 3

12
यह भी ध्यान दिया जाना चाहिए कि array_mergeNULL वापस आ जाएगा यदि कोई भी तर्क NULL हो।
19W पर सीन डब्ल्यूएम

4
यदि पूर्णांक कुंजियाँ हैं, तो उन्हें बदलकर पूर्णांक कुंजी में बदल दिया जाएगा। आप जो करने की कोशिश कर रहे हैं, उसे करने के लिए एक फ़ॉरच लूप का बेहतर उपयोग करें।
user2850305

24

जांच करें array_merge()

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

22
@SudhanshuSaxena ध्यान में रखते हुए मैं इसे पोस्ट करने वाला पहला व्यक्ति था, मैं नहीं देखता कि यह एक दोहराव का जवाब कैसे हो सकता है।
ब्रैड

10

वहाँ भी है array_replace, जहाँ एक मूल सरणी को कुंजी => मान को संरक्षित करने वाले अन्य सरणियों द्वारा संशोधित किया जाता है डुप्लिकेट कुंजी बिना संघ को ।

  • अन्य सरणियों पर समान कुंजियाँ मूल सरणी को अधिलेखित करने के लिए मान का कारण बनेंगी
  • अन्य सरणी पर नई कुंजियाँ मूल सरणी पर बनाई जाएंगी

1
यह सही जवाब है। यदि आपके पास संख्यात्मक कुंजियाँ हैं तो array_merge काम नहीं करेगा (सभी कुंजियाँ सुसंगत अनुक्रमित में बदल जाएँगी)।
दिमित्री

3

मैं null सरणियों के बारे में SeanWM की टिप्पणी से निपटने के लिए array_merge के आसपास एक रैपर का उपयोग करता हूं; मैं भी कभी-कभी डुप्लिकेट से छुटकारा पाना चाहता हूं। मैं भी आम तौर पर एक सरणी को दूसरे में विलय करना चाहता हूं, जैसा कि एक नया सरणी बनाने के विपरीत है। यह समाप्त होता है:

/**
 * Merge two arrays - but if one is blank or not an array, return the other.
 * @param $a array First array, into which the second array will be merged
 * @param $b array Second array, with the data to be merged
 * @param $unique boolean If true, remove duplicate values before returning
 */
function arrayMerge(&$a, $b, $unique = false) {
    if (empty($b)) {
        return;  // No changes to be made to $a
    }
    if (empty($a)) {
        $a = $b;
        return;
    }
    $a = array_merge($a, $b);
    if ($unique) {
        $a = array_unique($a);
    }
}

2
        $array = array(
            22 => true,
            25 => true,
            34 => true,
            35 => true,
        );

        print_r(
            array_replace($array, [
                22 => true,
                42 => true,
            ])
        );

        print_r(
            array_merge($array, [
                22 => true,
                42 => true,
            ])
        );

यदि यह संख्यात्मक है, लेकिन अनुक्रमिक सहयोगी सरणी नहीं है, तो आपको उपयोग करने की आवश्यकता है array_replace


0

मैं इस सवाल पर अड़ गया कि दो हत्यारों की गिरफ्तारी में शामिल होने के लिए एक साफ रास्ते की पहचान करने की कोशिश की जा रही है।

मैं दो अलग-अलग तालिकाओं में शामिल होने की कोशिश कर रहा था जिनमें एक-दूसरे से संबंध नहीं थे।

यह वही है जो मैं दो तालिकाओं में शामिल होने के लिए पीडीओ क्वेरी के साथ आया था। सैमुअल कुक ने array_merge()+1 के साथ मेरे लिए एक समाधान की पहचान की ।

        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = "SELECT * FROM ".databaseTbl_Residential_Prospects."";
        $ResidentialData = $pdo->prepare($sql);
        $ResidentialData->execute(array($lapi));
        $ResidentialProspects = $ResidentialData->fetchAll(PDO::FETCH_ASSOC);

        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = "SELECT * FROM ".databaseTbl_Commercial_Prospects."";
        $CommercialData = $pdo->prepare($sql);
        $CommercialData->execute(array($lapi));
        $CommercialProspects = $CommercialData->fetchAll(PDO::FETCH_ASSOC);

        $Prospects = array_merge($ResidentialProspects,$CommercialProspects);
        echo '<pre>';
        var_dump($Prospects);
        echo '</pre>';

शायद यह किसी और को बाहर करने में मदद करेगा।


0

अद्यतन बस एक त्वरित ध्यान दें, क्योंकि मैं देख सकता हूं कि यह वास्तव में बेवकूफ लग रहा है, और इसका शुद्ध पीएचपी के साथ कोई अच्छा उपयोग नहीं है क्योंकि array_mergeबस वहां काम करता है। लेकिन आप इसे नीचे लाने से पहले PHP MongoDB ड्राइवर के साथ प्रयास करें। वह जो भी कारण के लिए अनुक्रमणिका जोड़ देगा, और विलय की गई वस्तु को बर्बाद कर देगा। मेरे भोलेपन वाले छोटे से कार्य के साथ, मर्ज ठीक उसी तरह से सामने आता है जैसा कि एक पारंपरिक के साथ होना चाहिए था array_merge


मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन मैं एक और मामले मैंने हाल ही में MongoDB ड्राइवर प्रश्नों और से कोई भी साथ था जोड़ना चाहते हैं array_merge, array_replaceऔर न ही array_pushकाम किया। मेरे पास सरणी में सरणियों के रूप में लिपटे हुए वस्तुओं की एक जटिल संरचना थी:

$a = [
 ["a" => [1, "a2"]],
 ["b" => ["b1", 2]]
];
$t = [
 ["c" => ["c1", "c2"]],
 ["b" => ["b1", 2]]
];

और मुझे इस तरह से समान संरचना रखते हुए उन्हें मर्ज करने की आवश्यकता थी:

$merged = [
 ["a" => [1, "a2"]],
 ["b" => ["b1", 2]],
 ["c" => ["c1", "c2"]],
 ["b" => ["b1", 2]]
];

सबसे अच्छा समाधान मैं इस के साथ आया था:

public static function glueArrays($arr1, $arr2) {
    // merges TWO (2) arrays without adding indexing. 
    $myArr = $arr1;
    foreach ($arr2 as $arrayItem) {
        $myArr[] = $arrayItem;
    }
    return $myArr;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.