PHP - जाँच करें कि क्या दो सरणियाँ बराबर हैं


280

अगर दो सरणियाँ बराबर हैं, तो मैं जाँच करना चाहता हूँ। मेरा मतलब है: समान आकार, समान सूचकांक, समान मूल्य। मैं उसे कैसे कर सकता हूँ?

!==एक उपयोगकर्ता द्वारा सुझाए गए अनुसार उपयोग करते हुए , मुझे उम्मीद है कि निम्नलिखित प्रिंट दर्ज करेंगे यदि सरणी (एस) में कम से कम एक तत्व अलग है, लेकिन वास्तव में यह नहीं है।

if (($_POST['atlOriginal'] !== $oldAtlPosition) 
    or ($_POST['atl'] !== $aext) 
    or ($_POST['sidesOriginal'] !== $oldSidePosition) 
    or ($_POST['sidesOriginal'] !== $sideext)) {

    echo "enter";
}

17
आप =बहुत ज्यादा उपयोग कर रहे हैं , यह होना चाहिए !==या!=
२३:२

29
सिर्फ रिकॉर्ड के लिए (चूंकि मेरा संपादन "एक उपयोगकर्ता के लिए वापस बदल गया") यह "एक उपयोगकर्ता" है: english.stackexchange.com/questions/105116/…
teynon

7
['a'] == [0]है true। खैर, यह सिर्फ PHP है।
दाविद होर्वाथ

2
@ Dvvidhorváth यह वास्तव में अजीब है, एक अच्छा अभ्यास यह हमेशा उपयोग करने के लिए ===
AFA मेड

1
@ DávidHorváth, ढीली तुलना न केवल PHP में ढीली है। यदि आप जेएस को देखते हैं तो आप आश्चर्यचकित होंगे। बस तब तक उपयोग न करें जब तक आप चीजों को बेहतर तरीके से नहीं समझते।
रयबेंको-प्रो

जवाबों:


508
$arraysAreEqual = ($a == $b); // TRUE if $a and $b have the same key/value pairs.
$arraysAreEqual = ($a === $b); // TRUE if $a and $b have the same key/value pairs in the same order and of the same types.

ऐरे ऑपरेटर्स देखें ।

संपादित करें

असमानता ऑपरेटर है !=जबकि गैर-पहचान ऑपरेटर को !==समानता ऑपरेटर ==और पहचान ऑपरेटर से मेल खाना है ===


79
एक ओर ध्यान दें: यह दृष्टिकोण बहुआयामी सरणियों के लिए भी काम करता है (यह मेरे लिए पहले स्पष्ट नहीं था)।
ट्रेडर

5
पुनश्च: समाधान का उपयोग करना है array_values($a)==array_values($b)... एक और सामान्य समस्या अद्वितीय मूल्यों के बारे में है, इसलिए याद रखें कि मौजूद हैं array_unique()
पीटर क्रूस

13
यह उत्तर गलत है। ==केवल विशिष्ट शब्दकोशों जैसे आदेश के लिए काम करता है [1 => 'a', 2 => 'b']। उदाहरण के लिए [1 => 'a', 2 => 'b'] == [2 => 'b', 1 => 'a']। अनुक्रमित सरणियों के लिए, ['a', 'b'] ==जैसा कि कहा गया है, काम नहीं करता है। उदाहरण के लिए ['a', 'b'] != ['b', 'a']
नवफाल

37
@ नवाफल: आपकी धारणा गलत है। ['a', 'b']एक सरणी है [0 => 'a', 1 => 'b'], जबकि ['b', 'a']एक सरणी है [0 => 'b', 1 => 'a']। इसलिए उनके पास मेरे जवाब में बताई गई समान कुंजी / मूल्य वाली जोड़ी नहीं है और इसीलिए ==उनके बीच काम नहीं होता है।
स्टीफन गेहरिग

29
@StefanGehrig ओह तुम सही हो। मैं अपनी टिप्पणी को अपनी मूर्खता स्पष्ट करने के लिए छोड़ दूंगा :)
nawfal

88

के अनुसार यह पेज

नोट: स्वीकृत उत्तर सहयोगी सरणियों के लिए काम करता है, लेकिन यह अनुक्रमित सरणियों के साथ अपेक्षा के अनुरूप काम नहीं करेगा (नीचे समझाया गया है)। यदि आप दोनों में से किसी की तुलना करना चाहते हैं, तो इस घोल का उपयोग करें। इसके अलावा, यह फ़ंक्शन बहुआयामी सरणियों (array_diff फ़ंक्शन की प्रकृति के कारण) के साथ काम नहीं कर सकता है।

उदाहरण के लिए, दो अनुक्रमित सरणियों का परीक्षण करना, कौन से तत्व अलग-अलग क्रम में हैं, उपयोग $a == $bया $a === $bविफल हैं:

<?php
    (array("x","y") == array("y","x")) === false;
?>

ऐसा इसलिए है क्योंकि उपरोक्त साधन:

array(0 => "x", 1 => "y")बनाम array(0 => "y", 1 => "x")

उस समस्या को हल करने के लिए, उपयोग करें:

<?php
function array_equal($a, $b) {
    return (
         is_array($a) 
         && is_array($b) 
         && count($a) == count($b) 
         && array_diff($a, $b) === array_diff($b, $a)
    );
}
?>

तुलना के आकार को जोड़ा गया (सुपर_टन द्वारा सुझाया गया) क्योंकि यह गति में सुधार कर सकता है।



8
उपरोक्त टिप्पणी झूठी है। यदि $ b में सभी तत्व $ a हैं और कुछ अतिरिक्त हैं, तो दो सरणियाँ समान नहीं हैं, फिर भी उपरोक्त कोड कहेंगे कि वे हैं।
घोला

1
गिनती ($ a) == काउंट ($ b) भी जोड़ने लायक हो सकता है
स्टीफन

1
@ सुपर_टन: हां, कॉल करने से पहले array_diffतुलना को गति दे सकता है। मैं इसे जोड़ दूंगा। धन्यवाद
Lepe

3
दुर्भाग्य से, यह कुछ मामलों में काम नहीं करता है, उदाहरण के लिए, मैंने निम्नलिखित मामले के साथ परीक्षण किया है $a = [1, 2, 2]; $b = [2, 1, 1];और यह वापस आ गया है true, लेकिन दो सरणियों स्पष्ट रूप से समान नहीं हैं।
13

33

क्रमबद्ध करने का प्रयास करें। यह नेस्टेड सबरेज़ की भी जाँच करेगा।

$foo =serialize($array_foo);
$bar =serialize($array_bar);
if ($foo == $bar) echo "Foo and bar are equal";

7
तुलनात्मक उपयोग करने की तरह ही कुंजियों और मूल्यों को स्थानांतरित कर दिया जाए तो समस्यात्मक। हालांकि, यह मानते हुए कि वे 100% समान होने की उम्मीद करते हैं, गहरी समानता की जांच करने का यह सबसे साफ और आसान तरीका है!
केविन पेनो

1
मुझे लगता है कि यह सबसे अच्छा समाधान है! यह बहुआयामी और साहचर्य सरणियों की तुलना कर सकता है यदि वे पहले छांटे गए थे!
राफेल मोनी

13

लघु समाधान जो सरणियों के साथ भी काम करता है जो विभिन्न क्रम में दिए गए हैं:

public static function arrays_are_equal($array1, $array2)
{
    array_multisort($array1);
    array_multisort($array2);
    return ( serialize($array1) === serialize($array2) );
}

3
संभवत: अब तक का सबसे अच्छा जवाब, ज्यादातर जवाब या तो मेल नहीं खाते हैं अगर चाबियाँ स्थानांतरित की जाती हैं या यदि यह एक बहुआयामी सरणी है।
विस्मयकारी

11

उनकी तुलना अन्य मूल्यों के रूप में करें:

if($array_a == $array_b) {
  //they are the same
}

आप सभी सरणी ऑपरेटरों के बारे में यहां पढ़ सकते हैं: http://php.net/manual/en/language.operators.array.php नोट उदाहरण के लिए यह ===भी जाँचता है कि सरणियों में तत्वों के प्रकार और क्रम समान हैं।


5
या ===इच्छित व्यवहार पर निर्भर करता है।
मैथ्यू फ्लैशेन

9

!===काम नहीं करेगा क्योंकि यह एक सिंटैक्स त्रुटि है। सही तरीका है !==(तीन नहीं "प्रतीकों के बराबर")


5
if (array_diff($a,$b) == array_diff($b,$a)) {
  // Equals
}

if (array_diff($a,$b) != array_diff($b,$a)) {
  // Not Equals
}

मेरे पोव से array_intersect की तुलना में array_diff का उपयोग करना बेहतर है क्योंकि इस प्रकृति के चेक के साथ आमतौर पर लौटे अंतर समानता से कम होते हैं, इस तरह से बूल रूपांतरण कम मेमोरी भूख है।

संपादित करें ध्यान दें कि यह समाधान सादा सरणियों के लिए है और == और === एक है कि इसके बाद के संस्करण तैनात पूरक शब्दकोशों के लिए ही मान्य है।


4

array_diff - सरणियों के अंतर की गणना करता है

http://php.net/manual/en/function.array-diff.php

array array_diff ( array $array1 , array $array2 [, array $... ] )

array1एक या अधिक अन्य सरणियों की तुलना में और उस मान को लौटाता है जो array1किसी अन्य सरणियों में मौजूद नहीं है।


4
ओपी "जाँच करना चाहता है कि क्या दो सरणियाँ बराबर हैं"। array_diffआपको वह नहीं बता सकता। कोशिश करो array_diff([1, 2], [1, 2, 'hello'])
marcv

3

Http://php.net/manual/en/function.array-intersect.php का उपयोग करके मान आदेश कार्यों की परवाह किए बिना समानता की जाँच करने के लिए एक और तरीका :

$array1 = array(2,5,3);
$array2 = array(5,2,3);
if($array1 === array_intersect($array1, $array2) && $array2 === array_intersect($array2, $array1)) {
    echo 'Equal';
} else {
    echo 'Not equal';
}

यहाँ एक संस्करण है जो http://php.net/manual/en/function.array-uintersect.php का उपयोग करके बहुआयामी सरणियों के साथ भी काम करता है :

$array1 = array(
    array(5, 2),
    array(3, 6),
    array(2, 9, 4)
);
$array2 = array(
    array(3, 6),
    array(2, 9, 4),
    array(5, 2)
);

if($array1 === array_uintersect($array1, $array2, 'compare') && $array2 === array_uintersect($array2, $array1, 'compare')) {
    echo 'Equal';
} else {
    echo 'Not equal';
}

function compare($v1, $v2) {
    if ($v1===$v2) {
        return 0;
    }
    if ($v1 > $v2) return 1;
    return -1;
}

3
function compareIsEqualArray(array $array1,array $array):bool
{

   return array_diff($array1,$array2)==[];

}

2
एक कोड उदाहरण क्या कर रहा है यह समझाने में मददगार है। क्या यह बहुआयामी सरणियों के लिए भी काम करता है?
k0pernikus

1
array_diff सरणी से अलग तत्व प्राप्त करें यदि array_diff खाली खाली सरणी दो सरणी समान है
dılo sürücü

2

एक तरीका: ( http://tools.ietf.org/html/rfc6902#section-4.6 के लिए 'समान माना' लागू करना )

इस तरह से साहचर्य सरणियों की अनुमति मिलती है जिनके सदस्यों को अलग-अलग तरीके से आदेश दिया जाता है - जैसे कि उन्हें हर भाषा में समान माना जाता है लेकिन php :)

// recursive ksort
function rksort($a) {
  if (!is_array($a)) {
    return $a;
  }
  foreach (array_keys($a) as $key) {
    $a[$key] = ksort($a[$key]);
  }
  // SORT_STRING seems required, as otherwise
  // numeric indices (e.g. "0") aren't sorted.
  ksort($a, SORT_STRING);
  return $a;
}


// Per http://tools.ietf.org/html/rfc6902#section-4.6
function considered_equal($a1, $a2) {
  return json_encode(rksort($a1)) === json_encode(rksort($a2));
}

1
मेरा मानना ​​है कि आपको यह होना चाहिए:$a[$key] = rksort($a[$key]);
गुलाबी रानी


2

यहाँ उदाहरण है कि सरणियों की तुलना कैसे करें और प्राप्त करें कि उनके बीच क्या अंतर है।

$array1 = ['1' => 'XXX', 'second' => [
            'a' => ['test' => '2'],
            'b' => 'test'
        ], 'b' => ['no test']];

        $array2 = [
            '1' => 'XX',
            'second' => [
                'a' => ['test' => '5', 'z' => 5],
                'b' => 'test'
            ],
            'test'
        ];


        function compareArrayValues($arrayOne, $arrayTwo, &$diff = [], $reversed = false)
        {
            foreach ($arrayOne as $key => $val) {
                if (!isset($arrayTwo[$key])) {
                    $diff[$key] = 'MISSING IN ' . ($reversed ? 'FIRST' : 'SECOND');
                } else if (is_array($val) && (json_encode($arrayOne[$key]) !== json_encode($arrayTwo[$key]))) {
                    compareArrayValues($arrayOne[$key], $arrayTwo[$key], $diff[$key], $reversed);
                } else if ($arrayOne[$key] !== $arrayTwo[$key]) {
                    $diff[$key] = 'DIFFERENT';
                }
            }
        }

        $diff = [];
        $diffSecond = [];

        compareArrayValues($array1, $array2, $diff);
        compareArrayValues($array2, $array1, $diffSecond, true);

        print_r($diff);
        print_r($diffSecond);

        print_r(array_merge($diff, $diffSecond));

परिणाम:

Array
(
    [0] => DIFFERENT
    [second] => Array
        (
            [a] => Array
                (
                    [test] => DIFFERENT
                    [z] => MISSING IN FIRST
                )

        )

    [b] => MISSING IN SECOND
    [1] => DIFFERENT
    [2] => MISSING IN FIRST
)

1

Php फ़ंक्शन array_diff (array1, array2) का उपयोग करें;

यह सरणियों के बीच का अंतर लौटाएगा। अगर इसके खाली हैं तो वे बराबर हैं।

उदाहरण:

$array1 = array(
    'a' => 'value1',

    'b' => 'value2',

    'c' => 'value3'
 );

$array2 = array(
    'a' => 'value1',

    'b' => 'value2',

    'c' => 'value4'
 );

$diff = array_diff(array1, array2);

var_dump($diff); 

//it will print array = (0 => ['c'] => 'value4' ) 

उदाहरण 2:

$array1 = array(
    'a' => 'value1',

    'b' => 'value2',

    'c' => 'value3',
 );

$array2 = array(
    'a' => 'value1',

    'b' => 'value2',

    'c' => 'value3',
 );

$diff = array_diff(array1, array2);

var_dump($diff); 

//it will print empty; 

1
तकनीकी रूप से, यह सरणियों के बीच के अंतर को वापस नहीं करता है। प्रलेखन में कहा गया है, "एक या अधिक अन्य सरणियों के मुकाबले array1 की तुलना करें और array1 में उन मूल्यों को लौटाता है जो किसी अन्य सरणियों में मौजूद नहीं हैं।" इसलिए, अगर array2 से सभी मान array2 में मौजूद हैं, भले ही array2 में अधिक मान हों, array_diff खाली सरणी
लौटाएगा

"प्रिंट नल" नहीं करता है, एक खाली सरणी प्रिंट करता है (लगभग एक दर्जन वाक्यविन्यास त्रुटियों को ठीक करने के बाद)। हो सकता है कि आप यह (count(array_diff($a1, $a2)) + count(array_diff($a2, $a1))) === 0जांचने के लिए उपयोग कर सकें कि क्या सरणियाँ "बराबर" हैं
user9645

मैंने सिंटैक्स तय किया (शून्य खाली नहीं है, और मैं कॉमास मिश्रण कर रहा था -)। आप जो प्रस्ताव कर रहे हैं मुझे लगता है कि बहुत ज्यादा है। जाँच कर रहा है कि इसकी खाली सरणी पर्याप्त होनी चाहिए या नहीं।
वोल्फगैंग लियोन

1

यदि आप गैर साहचर्य सरणियों की जांच करना चाहते हैं, तो यहां समाधान है:

$a = ['blog', 'company'];
$b = ['company', 'blog'];

(count(array_unique(array_merge($a, $b))) === count($a)) ? 'Equals' : 'Not Equals';
// Equals
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.