質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

854閲覧

PHP連想配列から、「キーが1つでも存在する場合」を boolean で得る方法

nikuatsu

総合スコア177

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2022/01/05 12:38

編集2022/01/05 12:58

前提・実現したいこと

連装配列を複数キーと比較し、「キーが1つでも存在する場合」を boolean で得たいです。

発生している問題・エラーメッセージ

冗長なコードしか書けないのですが、もっと簡潔な書き方に挑戦しています。

該当のソースコード

連想配列$arrayと、複数キーのパターン$keys_Aおよび$keys_Bです。

$array = ['k1'=>1,'k2'=>2,'k3'=>3]; // パターンA $keys_A = ['k1','k4']; $is_keys_A = true; // 'k1' があるので true を得たい // パターンB $keys_B = ['k4','k5']; $is_keys_B = false; // 1つもないので false を得たい

試したこと

冗長なコードはこちらです。結果はこれを得たいです。

php

1// 連装配列と複数キー 2$array = ['k1'=>1,'k2'=>2,'k3'=>3]; 3$keys_A = ['k1','k4']; 4 5// 冗長なコード 6$is_keys_A = false; 7foreach ( $keys_A as $k ) { 8 if ( in_array($k, array_keys($array), true) ) { 9 $is_keys_A = true; 10 } 11} 12var_dump( $is_keys_A );// 正しく true を得ることができる

簡潔なコードとして挑戦しているのはこちらですが、なかなか思うようにできません。

php

1// 連装配列と複数キー 2$array = ['k1'=>1,'k2'=>2,'k3'=>3]; 3$keys_A = ['k1','k4']; 4 5// 簡潔なコードその1 → 失敗 6$is_keys_A = in_array( $keys_A, array_keys($array), true ); 7var_dump( $is_keys_A ); // false を得てしまう 8 9// 簡潔なコードその2 → 失敗 10$is_keys_A = !array_diff_key(array_flip($keys_A), $array); 11var_dump( $is_keys_A ); // false を得てしまう

1行くらいでさらっと書けないものでしょうか…

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ak.n

2022/01/05 13:05

最初のコードで十分簡潔だと思いますが、一点、if 内、$is_keys_A = true; の次の行で break; したほうが良いでしょうね。ひとつでもキーがあれば true なのですから、最後まで foreach を廻す必要はありません。
nikuatsu

2022/01/05 13:16

たしかに。1つ一致の時点で break; すべきでした。いつも忘れがちな記述です…。ありがとうございます。
guest

回答3

0

参考までに

php

1$is_keys_A = false; 2foreach($keys_A as $k) $is_keys_A = $is_keys_A || array_key_exists($k,$array);

とか

php

1$is_keys_A = (count(array_diff($keys_A,array_keys($array))) < count($keys_A));

など、実現方法はいくつかありますので自分がいいと思ったのを使えばいいと思います。

投稿2022/01/05 13:34

takasima20

総合スコア7464

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nikuatsu

2022/01/05 13:35

ありがとうございます。知っているはずの関数ですがそういった使いこなしはできませんでした。勉強になりました。
guest

0

ベストアンサー

複数の配列の共通項を求めるarray_intersect()という関数があります(マニュアル)。

なので、以下で、元の配列のキーと、複数キーの共通項が得られます。

<?php $array = ['k1'=>1,'k2'=>2,'k3'=>3]; // パターンA $keys_A = ['k1','k4']; var_dump(array_intersect(array_keys($array), $keys_A)); // 実行結果は以下のとおり array(1) { [0]=> string(2) "k1" }

キーが1つでもあることを確認するには、以下でよいと思います。

<?php $array = ['k1'=>1,'k2'=>2,'k3'=>3]; // パターンA $keys_A = ['k1','k4']; var_dump(!empty(array_intersect(array_keys($array), $keys_A))); // 実行結果は以下のとおり bool(true)

PHPには配列関数がたくさんあるので、もっとスマートな方法もあるような気はします。
ただ、このような書き方が分かりやすいかというと、そうではないので、私自身は「冗長なコード」を好みます。

投稿2022/01/05 13:00

ockeghem

総合スコア11705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nikuatsu

2022/01/05 13:15

array_intersect ですか!勉強になりました。ありがとうございます。たしかに「冗長なコード」もわかりやすくていいような気がしてきました。
guest

0

array_filter() を使う方法など。

php

1$is_keys_A = (bool)array_filter($array, fn($k) => in_array($k, $keys_A), 2);

投稿2022/01/05 14:02

melian

総合スコア20655

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問