in_array () dan array multidimensi

243

Saya gunakan in_array()untuk memeriksa apakah ada nilai dalam array seperti di bawah ini,

$a = array("Mac", "NT", "Irix", "Linux");
if (in_array("Irix", $a)) 
{
    echo "Got Irix";
}

//print_r($a);

tapi bagaimana dengan array multidimensi (di bawah) - bagaimana saya bisa memeriksa nilai itu apakah ada di multi-array?

$b = array(array("Mac", "NT"), array("Irix", "Linux"));

print_r($b);

atau saya tidak boleh menggunakan in_array()ketika datang ke array multidimensi?

laukok
sumber
1
Solusi yang diterima bekerja dengan baik tetapi dapat menyebabkan hasil yang tidak diinginkan ketika melakukan perbandingan yang tidak ketat karena jenis juggling PHP. Lihat: stackoverflow.com/a/48890256/1579327
Paolo
1
baik jawaban jwueller dan saya adalah jawaban yang benar untuk pertanyaan Anda. Saya mengusulkan solusi alternatif yang memperluas fungsi jwueller untuk menghindari pitfail umum karena juggling tipe PHP saat melakukan perbandingan yang tidak ketat.
Paolo
1
satu liner:var_dump(array_sum(array_map(function ($tmp) {return in_array('NT',$tmp);}, $multiarray)) > 0);
Agnius Vasiliauskas
1
@AgniusVasiliauskas solusi pintar, tetapi memiliki masalah jika array level pertama berisi item yang bukan array, mis:$multiarray = array( "Hello", array("Mac", "NT"), array("Irix", "Linux"));
Paolo
1
@ Paolo Tidak ada yang menghentikan Anda dari memperluas fungsi anonim sesuai dengan kebutuhan Anda - dalam hal ini tambahkan cek dalam fungsi anonim jika variabel $tmpadalah array dengan is_array()fungsi. Jika bukan array - lanjutkan dengan skenario yang berbeda.
Agnius Vasiliauskas

Jawaban:

473

in_array()tidak bekerja pada array multidimensi. Anda bisa menulis fungsi rekursif untuk melakukannya untuk Anda:

function in_array_r($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }

    return false;
}

Pemakaian:

$b = array(array("Mac", "NT"), array("Irix", "Linux"));
echo in_array_r("Irix", $b) ? 'found' : 'not found';
jwueller
sumber
1
Terima kasih. fungsinya elegan! suka! Terima kasih. bagaimana saya bisa tahu itu mengembalikan benar atau salah karena layar saya menunjukkan apa pun ketika saya menjalankan fungsi Anda? Terima kasih.
laukok
14
Saya sedang mencari sesuatu yang melakukan ini, Anda baru saja menyelamatkan saya dari menulis sendiri :)
Liam W
1
Ini bekerja dengan baik. Jadi bagaimana kita mencari dan menampilkan kunci array? Sebagai contoh: $ b = array (1 => array ("Mac", "NT"), 3 => array ("Irix", "Linux"));
Rashad
2
@ D.Tate Code on StackOverflow dilisensikan dengan cc by-sa 3.0 dengan atribusi yang diperlukan (lihat footer halaman). Anda bisa memasukkan komentar dengan tautan permanen ke jawaban ini.
jwueller
1
@blamb: Itu sangat disengaja. Inilah yang membuat fungsi rekursif (karenanya _r, analog dengan print_r(), misalnya). Itu turun ke semua array bersarang untuk mencari nilai sampai tidak ada lagi array yang ditemukan. Dengan cara ini, Anda dapat mencari melalui array kompleksitas sewenang-wenang, bukan hanya dua level.
jwueller
56

Jika Anda tahu kolom mana yang harus dicari, Anda dapat menggunakan array_search () dan array_column ():

$userdb = Array
(
    (0) => Array
        (
            ('uid') => '100',
            ('name') => 'Sandra Shush',
            ('url') => 'urlof100'
        ),

    (1) => Array
        (
            ('uid') => '5465',
            ('name') => 'Stefanie Mcmohn',
            ('url') => 'urlof5465'
        ),

    (2) => Array
        (
            ('uid') => '40489',
            ('name') => 'Michael',
            ('url') => 'urlof40489'
        )
);

if(array_search('urlof5465', array_column($userdb, 'url')) !== false) {
    echo 'value is in multidim array';
}
else {
    echo 'value is not in multidim array';
}

Ide ini ada di bagian komentar untuk array_search () pada manual PHP;

ethmz
sumber
15
Anda juga dapat mencoba: in_array ('value', array_column ($ arr, 'active'))
ekstro
1
Anda memerlukan PHP array_column
5.5+
1
Apakah mungkin untuk mendapatkan uid dari sub array yang cocok dalam contoh ini? @ethmz
zipal_
inilah yang saya inginkan
Juned Ansari
Ini sempurna setelah lama menemukan solusi ini!
Rohan Ashik
54

Ini juga akan berhasil.

function in_array_r($item , $array){
    return preg_match('/"'.preg_quote($item, '/').'"/i' , json_encode($array));
}

Pemakaian:

if(in_array_r($item , $array)){
    // found!
}
NassimPHP
sumber
3
Pintar, saya suka ini. Saya bertanya-tanya seperti apa performanya dibandingkan dengan foreachloop.
James
1
Bekerja seperti pesona.
hantu kemicofa
1
Jangan salah paham, saya suka pendekatan ini untuk kasus ini. Namun itu akan mengembalikan kecocokan positif palsu ketika json_encoding sebuah $arrayyang memiliki kunci asosiatif yang cocok $item. Belum lagi potensi untuk secara tidak sengaja mencocokkan bagian dari string ketika ada kutipan ganda dalam string itu sendiri. Saya hanya akan mempercayai fungsi ini dalam situasi kecil / sederhana seperti pertanyaan ini.
mickmackusa
Perhatikan bahwa ini akan gagal jika $itemberisi karakter yang mengacaukan parameter pertama (ekspresi reguler) daripreg_match
Paolo
35

Ini akan melakukannya:

foreach($b as $value)
{
    if(in_array("Irix", $value, true))
    {
        echo "Got Irix";
    }
}

in_array hanya beroperasi pada array satu dimensi, jadi Anda harus mengulang setiap sub array dan menjalankannya in_array masing-masing.

Seperti yang telah dicatat orang lain, ini hanya untuk array 2 dimensi. Jika Anda memiliki lebih banyak array bersarang, versi rekursif akan lebih baik. Lihat jawaban lain untuk contohnya.

Alan Geleynse
sumber
7
Namun, ini hanya akan bekerja dalam satu dimensi. Anda harus membuat fungsi rekursif untuk memeriksa setiap kedalaman.
metrobalderas
saya menjalankan kode tetapi memiliki kesalahan - Parse error: kesalahan parse di C: \ wamp \ www \ 000_TEST \ php \ php.in_array \ index.php pada baris 21 - yaitu if (in_array ("Irix", $ value ) terima kasih
laukok
@ lauthiamkok: Ada yang )hilang di akhir baris yang disebutkan.
jwueller
Terima kasih, saya memperbaiki jawaban saya. Itulah yang terjadi ketika saya mengetik terlalu cepat dan tidak membaca ulang kode saya.
Alan Geleynse
Anda harus selalu memanggil in_array()dengan parameter ketiga diatur ke true. Lihat di sini alasannya: stackoverflow.com/questions/37080581/…
Andreas
25

jika array Anda seperti ini

$array = array(
              array("name" => "Robert", "Age" => "22", "Place" => "TN"), 
              array("name" => "Henry", "Age" => "21", "Place" => "TVL")
         );

Gunakan ini

function in_multiarray($elem, $array,$field)
{
    $top = sizeof($array) - 1;
    $bottom = 0;
    while($bottom <= $top)
    {
        if($array[$bottom][$field] == $elem)
            return true;
        else 
            if(is_array($array[$bottom][$field]))
                if(in_multiarray($elem, ($array[$bottom][$field])))
                    return true;

        $bottom++;
    }        
    return false;
}

contoh: echo in_multiarray("22", $array,"Age");

rynhe
sumber
21
$userdb = Array
(
    (0) => Array
        (
            ('uid') => '100',
            ('name') => 'Sandra Shush',
            ('url') => 'urlof100'
        ),

    (1) => Array
        (
            ('uid') => '5465',
            ('name') => 'Stefanie Mcmohn',
            ('url') => 'urlof5465'
        ),

    (2) => Array
        (
            ('uid') => '40489',
            ('name') => 'Michael',
            ('url') => 'urlof40489'
        )
);

$url_in_array = in_array('urlof5465', array_column($userdb, 'url'));

if($url_in_array) {
    echo 'value is in multidim array';
}
else {
    echo 'value is not in multidim array';
}
Mukesh Goyal
sumber
2
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa memecahkan masalah akan meningkatkan nilai jangka panjang jawaban.
Donald Duck
3
6 tahun kemudian, itu memberi saya apa yang saya butuhkan. array_column()
NappingRabbit
jawaban sempurna untuk array multidimensi
Roshan Sankhe
14

Fungsi hebat, tetapi tidak berhasil bagi saya sampai saya menambahkan if($found) { break; }keelseif

function in_array_r($needle, $haystack) {
    $found = false;
    foreach ($haystack as $item) {
    if ($item === $needle) { 
            $found = true; 
            break; 
        } elseif (is_array($item)) {
            $found = in_array_r($needle, $item); 
            if($found) { 
                break; 
            } 
        }    
    }
    return $found;
}
Fernando
sumber
11

Untuk Anak Multidimensi: in_array('needle', array_column($arr, 'key'))

Untuk Anak Satu Dimensi: in_array('needle', call_user_func_array('array_merge', $arr))

Mohd Abdul Mujib
sumber
1
Rapi! Terima kasih @ 9ksoft
phaberest
Dan tidak seperti array_column()metode ini, call_user_func_array('array_merge')metode ini juga berfungsi dengan array anak berbasis indeks, +1
6

Anda selalu bisa membuat serial array multi-dimensi Anda dan melakukan strpos:

$arr = array(array("Mac", "NT"), array("Irix", "Linux"));

$in_arr = (bool)strpos(serialize($arr),'s:4:"Irix";');

if($in_arr){
    echo "Got Irix!";
}

Berbagai dokumen untuk hal-hal yang saya gunakan:


sumber
1
Itu salah. Fungsi Anda juga akan memberikan true jika string pencarian berisi beberapa nilai array (akan menemukan "Irix" di "mytoll Irixus").
mdunisch
Saya sudah memperbaiki jawaban saya. @ user3351722
cara ini dapat memperbaiki masalah ketika tidak ada lagi satu (unik vale), dan itu menjadi dinamis .. seperti ini $ in_arr = (bool) strpos (bersambung ($ user_term_was_downloaded), 's: 3: "tid"; s: 2: "'. $ Value-> tid.'"; ');
Anees Hikmat Abu Hmiad
2
@ I - A-Saya tidak berpikir siapa pun di Stack Overflow akan memposting kode jika mereka tidak ingin dibagikan. Jangan ragu menggunakan kode apa pun di situs web ini untuk apa pun. Saya biasanya menambahkan komentar satu baris di atas cuplikan kode yang bertuliskan "Terima kasih Stack Overflow" dan kemudian tempel URL yang saya temukan kodenya.
1
Jawaban yang menarik, pasti berfungsi dalam situasi tertentu, tetapi tidak semua.
MKN Web Solutions
4

Karena PHP 5.6 ada solusi yang lebih baik dan lebih bersih untuk jawaban aslinya:

Dengan array multidimensi seperti ini:

$a = array(array("Mac", "NT"), array("Irix", "Linux"))

Kita dapat menggunakan operator percikan :

return in_array("Irix", array_merge(...$a), true)

Jika Anda memiliki kunci string seperti ini:

$a = array("a" => array("Mac", "NT"), "b" => array("Irix", "Linux"))

Anda harus menggunakan array_valuesuntuk menghindari kesalahan Cannot unpack array with string keys:

return in_array("Irix", array_merge(...array_values($a)), true)
Fabien Salles
sumber
2

The diterima solusi (pada saat menulis) oleh jwueller

function in_array_r($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }

    return false;
}

Sangat benar tetapi mungkin memiliki perilaku yang tidak diinginkan ketika melakukan perbandingan lemah (parameter $strict = false ).

Karena jenis juggling PHP ketika membandingkan nilai-nilai dari tipe yang berbeda keduanya

"example" == 0

dan

0 == "example"

Mengevaluasi truekarena "example"dicor ke intdan diubah menjadi0 .

(Lihat Mengapa PHP menganggap 0 sama dengan string? )

Jika ini bukan perilaku yang diinginkan , akan lebih mudah untuk memberikan nilai numerik ke string sebelum melakukan perbandingan yang tidak ketat:

function in_array_r($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {

        if( ! $strict && is_string( $needle ) && ( is_float( $item ) || is_int( $item ) ) ) {
            $item = (string)$item;
        }

        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }

    return false;
}
Paolo
sumber
1

Ini adalah fungsi pertama dari jenis ini yang saya temukan di manual php untuk in_array . Fungsi di bagian komentar tidak selalu yang terbaik tetapi jika tidak melakukan trik Anda dapat melihat di sana juga :)

<?php
function in_multiarray($elem, $array)
    {
        // if the $array is an array or is an object
         if( is_array( $array ) || is_object( $array ) )
         {
             // if $elem is in $array object
             if( is_object( $array ) )
             {
                 $temp_array = get_object_vars( $array );
                 if( in_array( $elem, $temp_array ) )
                     return TRUE;
             }

             // if $elem is in $array return true
             if( is_array( $array ) && in_array( $elem, $array ) )
                 return TRUE;


             // if $elem isn't in $array, then check foreach element
             foreach( $array as $array_element )
             {
                 // if $array_element is an array or is an object call the in_multiarray function to this element
                 // if in_multiarray returns TRUE, than return is in array, else check next element
                 if( ( is_array( $array_element ) || is_object( $array_element ) ) && $this->in_multiarray( $elem, $array_element ) )
                 {
                     return TRUE;
                     exit;
                 }
             }
         }

         // if isn't in array return FALSE
         return FALSE;
    }
?>
Gazillion
sumber
solusi sulit dipahami lebih baik karena hanya untuk array
Gazillion
1

Berikut adalah proposisi saya berdasarkan solusi json_encode () dengan:

  • opsi case sensitif
  • mengembalikan hitungan bukannya benar
  • di mana saja dalam array (kunci dan nilai)

Jika kata tidak ditemukan, itu masih mengembalikan 0 sama dengan false .

function in_array_count($needle, $haystack, $caseSensitive = true) {
    if(!$caseSensitive) {
        return substr_count(strtoupper(json_encode($haystack)), strtoupper($needle));
    }
    return substr_count(json_encode($haystack), $needle);
}

Semoga ini bisa membantu.

Meloman
sumber
Perhatikan bahwa fungsi ini juga cocok dengan substring : ex 00into 10000atau lointo Hello. Selanjutnya akan gagal adalah jarum berisi karakter apa pun yang json_encodelolos , seperti tanda kutip ganda.
Paolo
Tentu saja itu tergantung apa yang akan Anda lakukan, tetapi bagi saya solusi ini memiliki eksekusi cepat dan cukup.
Meloman
1

Saya yakin Anda bisa menggunakan array_key_exists saat ini:

<?php
$a=array("Mac"=>"NT","Irix"=>"Linux");
if (array_key_exists("Mac",$a))
  {
  echo "Key exists!";
  }
else
  {
  echo "Key does not exist!";
  }
?>
SrAxi
sumber
1

Saya sedang mencari fungsi yang akan membiarkan saya mencari string dan array (sebagai jarum) dalam array (tumpukan jerami), jadi saya menambahkan jawaban oleh @jwueller .

Ini kode saya:

/**
 * Recursive in_array function
 * Searches recursively for needle in an array (haystack).
 * Works with both strings and arrays as needle.
 * Both needle's and haystack's keys are ignored, only values are compared.
 * Note: if needle is an array, all values in needle have to be found for it to
 * return true. If one value is not found, false is returned.
 * @param  mixed   $needle   The array or string to be found
 * @param  array   $haystack The array to be searched in
 * @param  boolean $strict   Use strict value & type validation (===) or just value
 * @return boolean           True if in array, false if not.
 */
function in_array_r($needle, $haystack, $strict = false) {
     // array wrapper
    if (is_array($needle)) {
        foreach ($needle as $value) {
            if (in_array_r($value, $haystack, $strict) == false) {
                // an array value was not found, stop search, return false
                return false;
            }
        }
        // if the code reaches this point, all values in array have been found
        return true;
    }

    // string handling
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle)
            || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }
    return false;
}
FreshSnow
sumber
0

Ini berfungsi juga membuat pertama Array unidimensional baru dari yang asli.

$arr = array("key1"=>"value1","key2"=>"value2","key3"=>"value3");

foreach ($arr as $row)  $vector[] = $row['key1'];

in_array($needle,$vector);
Banzy
sumber
0

Versi lebih pendek, untuk array multidimensi dibuat berdasarkan set hasil basis data.

function in_array_r($array, $field, $find){
    foreach($array as $item){
        if($item[$field] == $find) return true;
    }
    return false;
}

$is_found = in_array_r($os_list, 'os_version', 'XP');

Akan kembali jika array $ os_list berisi 'XP' di bidang os_version.

andreszs
sumber
0

Saya menemukan solusi sederhana yang sangat kecil:

Jika array Anda adalah:

Array
(
[details] => Array
    (
        [name] => Dhruv
        [salary] => 5000
    )

[score] => Array
    (
        [ssc] => 70
        [diploma] => 90
        [degree] => 70
    )

)

maka kodenya akan seperti:

 if(in_array("5000",$array['details'])){
             echo "yes found.";
         }
     else {
             echo "no not found";
          }
Dhruv Thakkar
sumber
0

Saya menggunakan metode ini berfungsi untuk sejumlah bersarang dan tidak memerlukan peretasan

<?php
    $blogCategories = [
        'programing' => [
            'golang',
            'php',
            'ruby',
            'functional' => [
                'Erlang',
                'Haskell'
            ]
        ],
        'bd' => [
            'mysql',
            'sqlite'
        ]
    ];
    $it = new RecursiveArrayIterator($blogCategories);
    foreach (new RecursiveIteratorIterator($it) as $t) {
        $found = $t == 'Haskell';
        if ($found) {
           break;
        }
    }
Sr. Libre
sumber
-1

Silakan coba:

in_array("irix",array_keys($b))
in_array("Linux",array_keys($b["irix"])

Saya tidak yakin tentang kebutuhan, tetapi ini mungkin cocok untuk kebutuhan Anda

sparco
sumber
2
Bagaimana cara mencari kunci array melakukan apa saja? $bKunci array hanya bilangan bulat ... tidak ada kunci yang ditentukan dalam array ini ... dan array_keys($b["irix"])hanya akan melempar kesalahan, karena $b["irix"]tidak ada.
Ben D