পিএইচপি - দুটি অ্যারে সমান কিনা তা পরীক্ষা করুন


280

আমি দুটি অ্যারে সমান কিনা তা পরীক্ষা করতে চাই। মানে: একই আকার, একই সূচক, একই মান। আমি এটা কিভাবে করবো?

!==কোনও ব্যবহারকারীর পরামর্শ অনুসারে ব্যবহার করে , আমি প্রত্যাশা করি যে অ্যারেতে কমপক্ষে একটি উপাদান আলাদা হয় তবে নিম্নলিখিতটি প্রবেশ প্রিন্ট করবে fact

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

    echo "enter";
}

17
আপনি একটি =খুব বেশি ব্যবহার করছেন , এটি হওয়া উচিত!==!=
জেরোইন

29
শুধু রেকর্ডের জন্য (যেহেতু আমার সম্পাদনায় যান "একটি ব্যবহারকারী" ফিরে পরিবর্তিত পেয়েছিলাম) এটি "একটি ব্যবহারকারী" is: english.stackexchange.com/questions/105116/...
teynon

7
['a'] == [0]হয় true। ঠিক আছে, এটি ঠিক পিএইচপি।
ডেভিড হোর্ভাথ

2
@ ডেভিডহোরভিথ এটি সত্যই অদ্ভুত, সর্বদা এটি ব্যবহার করার জন্য একটি ভাল অনুশীলন ===
এএফএ মেড মেড

1
@ ডেভিডহোরভিথ, আলগা তুলনা কেবল পিএইচপিই নয় loose জেএসের দিকে নজর দিলে আপনি অবাক হয়ে যাবেন। যতক্ষণ না আপনি জিনিসগুলি আরও ভাল বোঝেন ততক্ষণ ব্যবহার করবেন না।
ryabenko-প্রো

উত্তর:


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
@ স্টেফানগিরিগ ওহ আপনি ঠিক বলেছেন আমি আমার
মূর্খতাটি

88

এই পৃষ্ঠা অনুযায়ী ।

দ্রষ্টব্য: গৃহীত উত্তরটি অ্যা্যাসোসিয়েটিভ অ্যারেগুলির জন্য কাজ করে তবে এটি সূচকযুক্ত অ্যারেগুলির সাথে প্রত্যাশার মতো কাজ করবে না (নীচে বর্ণিত)। যদি আপনি তাদের যে কোনওটির তুলনা করতে চান, তবে এই সমাধানটি ব্যবহার করুন। এছাড়াও, এই ফাংশনটি বহুমাত্রিক অ্যারেগুলির সাথে কাজ করতে পারে না (অ্যারে_ডিফ ফাংশনের প্রকৃতির কারণে)।

দুটি সূচিকৃত অ্যারে পরীক্ষা করা, কোন উপাদানগুলি বিভিন্ন ক্রমে থাকে, ব্যবহার $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
উপরের মন্তব্যটি মিথ্যা। যদি $ বি এর সমস্ত উপাদান থাকে $ এ এর ​​সাথে কিছু অতিরিক্ত কিছু থাকে তবে দুটি অ্যারে সমান নয় তবুও উপরের কোডটি সেগুলি বলবে।
ঘোলা

1
গণনা যোগ করার উপযুক্ত হতে পারে () এ) == গণনা ($ বি)
স্টিফান

1
@ সুপার_টন: হ্যাঁ, কল করার আগে array_diffতুলনাটি দ্রুত করা সম্ভব। আমি এটি যোগ করব। ধন্যবাদ
lepe

3
দুর্ভাগ্যক্রমে, এটি কিছু ক্ষেত্রে কার্যকর হয় না, উদাহরণস্বরূপ, আমি নিম্নলিখিত কেসটি দিয়ে পরীক্ষা করেছি $a = [1, 2, 2]; $b = [2, 1, 1];এবং এটি ফিরে এসেছে true, তবে দুটি অ্যারে স্পষ্টতই এক নয়।
আশ্চর্যজনক

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
}

আমার pov থেকে অ্যারে_ইন্টারসেক্টের চেয়ে অ্যারে_ডিফ ব্যবহার করা ভাল কারণ এই প্রকৃতির পরীক্ষার সাথে সাধারণত ফিরে আসা পার্থক্যগুলি মিলগুলির চেয়ে কম হয়, এইভাবে বুল রূপান্তর ক্ষুধার্ত স্মৃতিশক্তি কম less

সম্পাদনা করুন নোট করুন যে এই সমাধানটি সরল অ্যারেগুলির জন্য এবং এরপরে পোস্ট করা একটি == এবং === যা কেবল অভিধানের জন্য বৈধ।


4

অ্যারে_ডিফ - অ্যারের পার্থক্য গণনা করে

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'])
মার্চভি

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
অ্যারে_ডিফ অ্যারে থেকে আলাদা উপাদান পান যদি অ্যারে_ডিফ খালি অ্যারে দুটি অ্যারের সমান হয়
ডেলো সিরিজ

2

একটি উপায়: ( http://tools.ietf.org/html/rfc6902#section-4.6 এর জন্য 'সমান বিবেচিত' বাস্তবায়ন করা )

এই পদ্ধতিতে সাহসী অ্যারেগুলিকে যার সদস্যদের আলাদাভাবে অর্ডার দেওয়া হয়েছে - উদাহরণস্বরূপ তারা প্রতিটি ভাষায় সমান বিবেচনা করবেন তবে পিএইচপি :)

// 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

পিএইচপি ফাংশন অ্যারে_ডিফ ব্যবহার করুন (অ্যারে 1, অ্যারে 2);

এটি অ্যারের মধ্যে পার্থক্য ফিরিয়ে দেবে। যদি এটি খালি থাকে তবে তারা সমান।

উদাহরণ:

$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
প্রযুক্তিগতভাবে, এটি অ্যারের মধ্যে পার্থক্য ফিরিয়ে দেয় না। ডকুমেন্টেশনটিতে বলা হয়েছে "এক বা একাধিক অ্যারের সাথে অ্যারে 1 এর তুলনা করা হয় এবং অ্যারে 1 এ থাকা মানগুলি প্রদান করে যা অন্য কোনও অ্যারেতে উপস্থিত নেই"। সুতরাং, অ্যারে 1 থেকে সমস্ত মান অ্যারে 2 তে উপস্থিত থাকলেও অ্যারে 2 এর আরও মান থাকলেও অ্যারে_ডিফ একটি ফাঁকা অ্যারে প্রদান করবে
2pha

"নাল মুদ্রণ" করে না, একটি ফাঁকা অ্যারের মুদ্রণ করে (প্রায় এক ডজন সিনট্যাক্স ত্রুটিগুলি স্থির করার পরে)। (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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.