Saya memiliki berbagai array yang akan berisi
story & message
atau hanya
story
Bagaimana saya memeriksa untuk melihat apakah sebuah array berisi cerita dan pesan? array_key_exists()
hanya mencari kunci tunggal itu dalam larik.
Apakah ada cara untuk melakukan ini?
array_intersect_key()
bandingkan larik kunci yang ingin Anda verifikasi dengan larik yang Anda periksa. Jika panjang output sama dengan larik kunci yang akan diperiksa, semuanya ada.["story & message" => "value"]
atau lebih seperti["story & message"]
Jawaban:
Jika Anda hanya memiliki 2 kunci untuk diperiksa (seperti pada pertanyaan awal), mungkin cukup mudah untuk memanggil
array_key_exists()
dua kali untuk memeriksa apakah ada kunci.if (array_key_exists("story", $arr) && array_key_exists("message", $arr)) { // Both keys exist. }
Namun ini jelas tidak berskala dengan baik untuk banyak kunci. Dalam situasi itu, fungsi kustom akan membantu.
function array_keys_exists(array $keys, array $arr) { return !array_diff_key(array_flip($keys), $arr); }
sumber
$keys
berisi satu elemen yang tidak$arr
ada di dalamnya dan elemen lain yang ada di dalamnya,!array_diff_key
mengembalikan kosong =>false
( contoh 3v4l ) ...!array_diff($keys, array_keys($array));
karena ada sedikit beban kognitif yang terlibat dalam mengerjakannyaarray_flip
.Berikut adalah solusi yang dapat diskalakan, bahkan jika Anda ingin memeriksa sejumlah besar kunci:
<?php // The values in this arrays contains the names of the indexes (keys) // that should exist in the data array $required = array('key1', 'key2', 'key3'); $data = array( 'key1' => 10, 'key2' => 20, 'key3' => 30, 'key4' => 40, ); if (count(array_intersect_key(array_flip($required), $data)) === count($required)) { // All required keys exist! }
sumber
Anehnya
array_keys_exist
tidak ada ?! Untuk sementara yang menyisakan ruang untuk mencari ekspresi baris tunggal untuk tugas umum ini. Saya sedang memikirkan skrip shell atau program kecil lainnya.Catatan: setiap solusi berikut menggunakan
[…]
sintaks deklarasi larik ringkas yang tersedia di php 5.4+array_diff + array_keys
if (0 === count(array_diff(['story', 'message', '…'], array_keys($source)))) { // all keys found } else { // not all }
(tip topi untuk Kim Stacks )
Pendekatan ini adalah yang paling singkat yang saya temukan.
array_diff()
mengembalikan larik item yang ada dalam argumen 1 tidak ada dalam argumen2. Oleh karena itu, array kosong menunjukkan semua kunci ditemukan. Di php 5.5 Anda bisa menyederhanakan0 === count(…)
menjadi sederhanaempty(…)
.array_reduce + unset
if (0 === count(array_reduce(array_keys($source), function($in, $key){ unset($in[array_search($key, $in)]); return $in; }, ['story', 'message', '…']))) { // all keys found } else { // not all }
Lebih sulit dibaca, mudah diubah.
array_reduce()
menggunakan callback untuk mengulangi larik untuk mendapatkan nilai. Dengan memberi makan kunci yang kita minati$initial
nilainya$in
dan kemudian menghapus kunci yang ditemukan di source, kita dapat berharap untuk mengakhiri dengan 0 elemen jika semua kunci ditemukan.Konstruksinya mudah dimodifikasi karena tombol yang kami minati pas dengan baik.
array_filter & in_array
if (2 === count(array_filter(array_keys($source), function($key) { return in_array($key, ['story', 'message']); } ))) { // all keys found } else { // not all }
Lebih sederhana untuk menulis daripada
array_reduce
solusinya tetapi sedikit lebih sulit untuk diedit.array_filter
juga merupakan callback berulang yang memungkinkan Anda membuat array yang difilter dengan mengembalikan true (salin item ke array baru) atau false (jangan salin) di callback. Gotchya adalah Anda harus mengubah2
jumlah item yang Anda harapkan.Ini dapat dibuat lebih tahan lama tetapi hampir pada keterbacaan yang tidak masuk akal:
$find = ['story', 'message']; if (count($find) === count(array_filter(array_keys($source), function($key) use ($find) { return in_array($key, $find); }))) { // all keys found } else { // not all }
sumber
Menurut saya, metode termudah sejauh ini adalah ini:
$required = array('a','b','c','d'); $values = array( 'a' => '1', 'b' => '2' ); $missing = array_diff_key(array_flip($required), $values);
Cetakan:
Array( [c] => 2 [d] => 3 )
Ini juga memungkinkan untuk memeriksa kunci mana yang hilang dengan tepat. Ini mungkin berguna untuk penanganan kesalahan.
sumber
Satu lagi solusi yang mungkin:
if (!array_diff(['story', 'message'], array_keys($array))) { // OK: all the keys are in $array } else { // FAIL: some keys are not }
sumber
Solusi di atas pintar, tetapi sangat lambat. Perulangan foreach sederhana dengan isset lebih dari dua kali lebih cepat dari
array_intersect_key
solusi.function array_keys_exist($keys, $array){ foreach($keys as $key){ if(!array_key_exists($key, $array))return false; } return true; }
(344ms vs 768ms untuk 1000000 iterasi)
sumber
false
(false
menimpatrue
dalam kasus ini). Jadi, yang berfungsi untuk kebutuhan saya adalah Kebutuhanforeach ($keys as $key) { if (array_key_exists($key, $array)) { return true; }} return false;
saya jikaany
kunci dalam array ada di array lain ...Jika Anda memiliki sesuatu seperti ini:
$stuff = array(); $stuff[0] = array('story' => 'A story', 'message' => 'in a bottle'); $stuff[1] = array('story' => 'Foo');
Anda cukup
count()
:foreach ($stuff as $value) { if (count($value) == 2) { // story and message } else { // only story } }
Ini hanya berfungsi jika Anda tahu pasti bahwa Anda HANYA memiliki kunci array ini, dan tidak ada yang lain.
Menggunakan array_key_exists () hanya mendukung pemeriksaan satu kunci pada satu waktu, jadi Anda perlu memeriksa keduanya secara terpisah:
foreach ($stuff as $value) { if (array_key_exists('story', $value) && array_key_exists('message', $value) { // story and message } else { // either one or both keys missing } }
array_key_exists()
mengembalikan nilai true jika kunci ada dalam array, tetapi ini adalah fungsi nyata dan banyak yang harus diketik. Konstruksi bahasaisset()
akan hampir melakukan hal yang sama, kecuali jika nilai yang diuji adalah NULL:foreach ($stuff as $value) { if (isset($value['story']) && isset($value['message']) { // story and message } else { // either one or both keys missing } }
Selain itu, isset memungkinkan untuk memeriksa beberapa variabel sekaligus:
foreach ($stuff as $value) { if (isset($value['story'], $value['message']) { // story and message } else { // either one or both keys missing } }
Sekarang, untuk mengoptimalkan pengujian untuk hal-hal yang disetel, Anda sebaiknya menggunakan "jika" ini:
foreach ($stuff as $value) { if (isset($value['story']) { if (isset($value['message']) { // story and message } else { // only story } } else { // No story - but message not checked } }
sumber
Bagaimana dengan ini:
isset($arr['key1'], $arr['key2'])
hanya mengembalikan nilai true jika keduanya bukan nol
jika null, key tidak dalam array
sumber
$arr['key1']
atau$arr['key2']
adalahnull
, kode akan, kuncinya masih ada.foreach
loop?isset
fungsi berfungsi seperti yang saya maksud, tetapi sekarang saya menyadari bahwa Anda benar, kunci masih tetap berada dalam array dan oleh karena itu jawaban saya tidak benar, terima kasih atas umpan baliknya. Ya, saya bisa menggunakannyaforeach
.Saya sering menggunakan sesuatu seperti ini
$wantedKeys = ['story', 'message']; $hasWantedKeys = count(array_intersect(array_keys($source), $wantedKeys)) > 0
atau untuk menemukan nilai kunci yang diinginkan
$wantedValues = array_intersect_key($source, array_fill_keys($wantedKeys, 1))
sumber
coba ini
$required=['a','b'];$data=['a'=>1,'b'=>2]; if(count(array_intersect($required,array_keys($data))>0){ //a key or all keys in required exist in data }else{ //no keys found }
sumber
Ini adalah fungsi yang saya tulis untuk saya gunakan dalam kelas.
<?php /** * Check the keys of an array against a list of values. Returns true if all values in the list is not in the array as a key. Returns false otherwise. * * @param $array Associative array with keys and values * @param $mustHaveKeys Array whose values contain the keys that MUST exist in $array * @param &$missingKeys Array. Pass by reference. An array of the missing keys in $array as string values. * @return Boolean. Return true only if all the values in $mustHaveKeys appear in $array as keys. */ function checkIfKeysExist($array, $mustHaveKeys, &$missingKeys = array()) { // extract the keys of $array as an array $keys = array_keys($array); // ensure the keys we look for are unique $mustHaveKeys = array_unique($mustHaveKeys); // $missingKeys = $mustHaveKeys - $keys // we expect $missingKeys to be empty if all goes well $missingKeys = array_diff($mustHaveKeys, $keys); return empty($missingKeys); } $arrayHasStoryAsKey = array('story' => 'some value', 'some other key' => 'some other value'); $arrayHasMessageAsKey = array('message' => 'some value', 'some other key' => 'some other value'); $arrayHasStoryMessageAsKey = array('story' => 'some value', 'message' => 'some value','some other key' => 'some other value'); $arrayHasNone = array('xxx' => 'some value', 'some other key' => 'some other value'); $keys = array('story', 'message'); if (checkIfKeysExist($arrayHasStoryAsKey, $keys)) { // return false echo "arrayHasStoryAsKey has all the keys<br />"; } else { echo "arrayHasStoryAsKey does NOT have all the keys<br />"; } if (checkIfKeysExist($arrayHasMessageAsKey, $keys)) { // return false echo "arrayHasMessageAsKey has all the keys<br />"; } else { echo "arrayHasMessageAsKey does NOT have all the keys<br />"; } if (checkIfKeysExist($arrayHasStoryMessageAsKey, $keys)) { // return false echo "arrayHasStoryMessageAsKey has all the keys<br />"; } else { echo "arrayHasStoryMessageAsKey does NOT have all the keys<br />"; } if (checkIfKeysExist($arrayHasNone, $keys)) { // return false echo "arrayHasNone has all the keys<br />"; } else { echo "arrayHasNone does NOT have all the keys<br />"; }
Saya berasumsi Anda perlu memeriksa beberapa kunci SEMUA ADA dalam sebuah array. Jika Anda mencari kecocokan setidaknya satu kunci, beri tahu saya agar saya dapat memberikan fungsi lain.
Codepad di sini http://codepad.viper-7.com/AKVPCH
sumber
if (0 === count(array_diff(['key1','key2','key3'], array_keys($lookIn)))) { // all keys exist } else { // nope }
Semoga ini membantu:
function array_keys_exist($searchForKeys = array(), $inArray = array()) { $inArrayKeys = array_keys($inArray); return count(array_intersect($searchForKeys, $inArrayKeys)) == count($searchForKeys); }
sumber
Ini sudah tua dan mungkin akan terkubur, tapi ini adalah usahaku.
Saya mengalami masalah yang mirip dengan @Ryan. Dalam beberapa kasus, saya perlu hanya memeriksa apakah minimal 1 utama adalah dalam array, dan dalam beberapa kasus, semua yang diperlukan untuk hadir.
Jadi saya menulis fungsi ini:
/** * A key check of an array of keys * @param array $keys_to_check An array of keys to check * @param array $array_to_check The array to check against * @param bool $strict Checks that all $keys_to_check are in $array_to_check | Default: false * @return bool */ function array_keys_exist(array $keys_to_check, array $array_to_check, $strict = false) { // Results to pass back // $results = false; // If all keys are expected // if ($strict) { // Strict check // // Keys to check count // $ktc = count($keys_to_check); // Array to check count // $atc = count(array_intersect($keys_to_check, array_keys($array_to_check))); // Compare all // if ($ktc === $atc) { $results = true; } } else { // Loose check - to see if some keys exist // // Loop through all keys to check // foreach ($keys_to_check as $ktc) { // Check if key exists in array to check // if (array_key_exists($ktc, $array_to_check)) { $results = true; // We found at least one, break loop // break; } } } return $results; }
Ini jauh lebih mudah daripada harus menulis banyak
||
dan&&
blok.sumber
Apa ini tidak berhasil?
array_key_exists('story', $myarray) && array_key_exists('message', $myarray)
sumber
<?php function check_keys_exists($keys_str = "", $arr = array()){ $return = false; if($keys_str != "" and !empty($arr)){ $keys = explode(',', $keys_str); if(!empty($keys)){ foreach($keys as $key){ $return = array_key_exists($key, $arr); if($return == false){ break; } } } } return $return; }
// jalankan demo
$key = 'a,b,c'; $array = array('a'=>'aaaa','b'=>'ccc','c'=>'eeeee'); var_dump( check_keys_exists($key, $array));
sumber
Saya tidak yakin, apakah itu ide yang buruk tetapi saya menggunakan foreach loop yang sangat sederhana untuk memeriksa beberapa kunci array.
// get post attachment source url $image = wp_get_attachment_image_src(get_post_thumbnail_id($post_id), 'single-post-thumbnail'); // read exif data $tech_info = exif_read_data($image[0]); // set require keys $keys = array('Make', 'Model'); // run loop to add post metas foreach key foreach ($keys as $key => $value) { if (array_key_exists($value, $tech_info)) { // add/update post meta update_post_meta($post_id, MPC_PREFIX . $value, $tech_info[$value]); } }
sumber
// sample data $requiredKeys = ['key1', 'key2', 'key3']; $arrayToValidate = ['key1' => 1, 'key2' => 2, 'key3' => 3]; function keysExist(array $requiredKeys, array $arrayToValidate) { if ($requiredKeys === array_keys($arrayToValidate)) { return true; } return false; }
sumber
$myArray = array('key1' => '', 'key2' => ''); $keys = array('key1', 'key2', 'key3'); $keyExists = count(array_intersect($keys, array_keys($myArray)));
Akan mengembalikan true, karena ada kunci dari array $ keys di $ myArray
sumber
Sesuatu seperti ini bisa digunakan
//Say given this array $array_in_use2 = ['hay' => 'come', 'message' => 'no', 'story' => 'yes']; //This gives either true or false if story and message is there count(array_intersect(['story', 'message'], array_keys($array_in_use2))) === 2;
Pembaruan
Dalam satu fungsi lemak :
/** * Like php array_key_exists, this instead search if (one or more) keys exists in the array * @param array $needles - keys to look for in the array * @param array $haystack - the <b>Associative</b> array to search * @param bool $all - [Optional] if false then checks if some keys are found * @return bool true if the needles are found else false. <br> * Note: if hastack is multidimentional only the first layer is checked<br>, * the needles should <b>not be<b> an associative array else it returns false<br> * The array to search must be associative array too else false may be returned */ function array_keys_exists($needles, $haystack, $all = true) { $size = count($needles); if($all) return count(array_intersect($needles, array_keys($haystack))) === $size; return !empty(array_intersect($needles, array_keys($haystack))); }
Jadi misalnya dengan ini:
$array_in_use2 = ['hay' => 'come', 'message' => 'no', 'story' => 'yes']; //One of them exists --> true $one_or_more_exists = array_keys_exists(['story', 'message'], $array_in_use2, false); //all of them exists --> true $all_exists = array_keys_exists(['story', 'message'], $array_in_use2);
Semoga ini membantu :)
sumber
Saya biasanya menggunakan fungsi untuk memvalidasi posting saya dan itu adalah jawaban untuk pertanyaan ini juga jadi izinkan saya mempostingnya.
untuk memanggil fungsi saya, saya akan menggunakan 2 array seperti ini
validatePost(['username', 'password', 'any other field'], $_POST))
maka fungsi saya akan terlihat seperti ini
function validatePost($requiredFields, $post) { $validation = []; foreach($requiredFields as $required => $key) { if(!array_key_exists($key, $post)) { $validation['required'][] = $key; } } return $validation; }
ini akan menampilkan ini
"wajib": ["nama pengguna", "sandi", "bidang lainnya"]
jadi yang dilakukan fungsi ini adalah memvalidasi dan mengembalikan semua bidang yang hilang dari permintaan posting.
sumber
$colsRequired = ["apple", "orange", "banana", "grapes"]; $data = ["apple"=>"some text", "orange"=>"some text"]; $presentInBoth = array_intersect($colsRequired,array_keys($data)); if( count($presentInBoth) != count($colsRequired)) echo "Missing keys :" . join(",",array_diff($colsRequired,$presentInBoth)); else echo "All Required cols are present";
sumber