次のいずれかを含むさまざまな配列があります
story & message
あるいは単に
story
配列にストーリーとメッセージの両方が含まれているかどうかを確認するにはどうすればよいですか? array_key_exists()
配列内のその単一のキーのみを探します。
これを行う方法はありますか?
多数のキーをチェックしたい場合でも、スケーラブルなソリューションを次に示します。
<?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!
}
チェックするキーが2つしかない場合(元の質問のように)、array_key_exists()
キーが存在するかどうかを確認するために2回呼び出すだけで十分簡単です。
if (array_key_exists("story", $arr) && array_key_exists("message", $arr)) {
// Both keys exist.
}
ただし、これは明らかに多くのキーにうまくスケールアップしません。そのような状況では、カスタム関数が役立ちます。
function array_keys_exists(array $keys, array $arr) {
return !array_diff_key(array_flip($keys), $arr);
}
意外と無いのarray_keys_exist
では!? 暫定的に、この一般的なタスクの 1 行の式を把握するためのスペースを残します。シェル スクリプトまたは別の小さなプログラムを考えています。
注: 次の各ソリューションでは[…]
、php 5.4+ で利用可能な簡潔な配列宣言構文を使用しています。
if (0 === count(array_diff(['story', 'message', '…'], array_keys($source)))) {
// all keys found
} else {
// not all
}
( Kim Stacksへのハット チップ)
このアプローチは、私が見つけた中で最も簡単です。引数 1 に存在し、引数 2 に存在しないarray_diff()
アイテムの配列を返します。したがって、空の配列は、すべてのキーが見つかったことを示します。PHP 5.5 では、単純化して.0 === count(…)
empty(…)
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
}
読みにくく、変更しやすい。array_reduce()
コールバックを使用して配列を反復処理し、値に到達します。$initial
値に関心のあるキーを$in
入力し、ソースで見つかったキーを削除することで、すべてのキーが見つかった場合に 0 要素で終わることが期待できます。
関心のあるキーが収益にうまく適合するため、構造は簡単に変更できます。
if (2 === count(array_filter(array_keys($source), function($key) {
return in_array($key, ['story', 'message']); }
)))
{
// all keys found
} else {
// not all
}
ソリューションよりも書くのは簡単ですが、array_reduce
編集するのは少しトリッキーです。array_filter
は、コールバックで true (項目を新しい配列にコピーする) または false (コピーしない) を返すことによって、フィルター処理された配列を作成できる反復コールバックでもあります。2
問題は、期待するアイテムの数に変更する必要があるということです。
これはより耐久性のあるものにすることができますが、途方もない可読性に直面しています:
$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
}
私には、これまでで最も簡単な方法は次のようになると思われます。
$required = array('a','b','c','d');
$values = array(
'a' => '1',
'b' => '2'
);
$missing = array_diff_key(array_flip($required), $values);
版画:
Array(
[c] => 2
[d] => 3
)
これにより、どのキーが正確に欠落しているかを確認することもできます。これは、エラー処理に役立つ場合があります。
もう1つの可能な解決策:
if (!array_diff(['story', 'message'], array_keys($array))) {
// OK: all the keys are in $array
} else {
// FAIL: some keys are not
}
上記の解決策は賢いですが、非常に遅いです。array_intersect_key
isset を使用した単純な foreach ループは、ソリューションの 2 倍以上高速です。
function array_keys_exist($keys, $array){
foreach($keys as $key){
if(!array_key_exists($key, $array))return false;
}
return true;
}
(1000000 回の反復で 344ms 対 768ms)
あなたがこのようなものを持っているなら:
$stuff = array();
$stuff[0] = array('story' => 'A story', 'message' => 'in a bottle');
$stuff[1] = array('story' => 'Foo');
あなたは単にcount()
:
foreach ($stuff as $value) {
if (count($value) == 2) {
// story and message
} else {
// only story
}
}
これは、これらの配列キーのみがあり、他には何もないことが確実にわかっている場合にのみ機能します。
array_key_exists()の使用は、一度に1つのキーのチェックのみをサポートするため、両方を個別にチェックする必要があります。
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()
キーが配列に存在する場合はtrueを返しますが、これは実際の関数であり、入力することがたくさんあります。isset()
テストされた値がNULLの場合を除いて、言語構成はほぼ同じことを行います。
foreach ($stuff as $value) {
if (isset($value['story']) && isset($value['message']) {
// story and message
} else {
// either one or both keys missing
}
}
さらに、issetを使用すると、複数の変数を一度にチェックできます。
foreach ($stuff as $value) {
if (isset($value['story'], $value['message']) {
// story and message
} else {
// either one or both keys missing
}
}
ここで、設定されているもののテストを最適化するには、次の「if」を使用することをお勧めします。
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
}
}
これはどうですか:
isset($arr['key1'], $arr['key2'])
両方が null でない場合にのみ true を返す
null の場合、キーは配列にありません
それが悪い考えかどうかはわかりませんが、非常に単純な foreach ループを使用して複数の配列キーをチェックします。
// 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]);
}
}
これは機能しませんか?
array_key_exists('story', $myarray) && array_key_exists('message', $myarray)
<?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;
}
//デモを実行
$key = 'a,b,c';
$array = array('a'=>'aaaa','b'=>'ccc','c'=>'eeeee');
var_dump( check_keys_exists($key, $array));
// 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;
}
$myArray = array('key1' => '', 'key2' => '');
$keys = array('key1', 'key2', 'key3');
$keyExists = count(array_intersect($keys, array_keys($myArray)));
$myArray に $keys 配列のキーがあるため、true を返します。
このようなものを使用できます
//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;
2 に対するチェックに注意してください。検索する値が異なる場合は変更できます。
このソリューションは効率的ではないかもしれませんが、うまくいきます!
アップデート
1 つの脂肪関数で:
/**
* 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)));
}
たとえば、次のようにします。
$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);
お役に立てれば :)