2017-10-13 4 views
1

私は2つの配列を持っています。配列のキーを返すのは、配列Aに見つからない場合だけです。

$fields = array("first_name" => "test", "last_name" => "Test", "phone" =>"111-111-1111, "id" => 1234"); 

もう1つはcsvファイルの最初の行から取得されます。これは、私は、その後の$ fields配列のキーのいずれにも一致しない$ヘッダ配列のキーがある場合は、エラーを返すようにしたいので、

$headers = array ("fname" => "test", "last_name" => "Test", "phone"=> "123-123-1234"); 

のような配列を返します。 $ fields配列内のキーがすべて$ headers配列内に存在しない場合でも問題ありません。

たとえば、上記の2つの配列は、キーfnameが$ fields配列に存在しないため、$ headers配列にIDがないため、エラーを返すはずです。

私は複数のループを使ってif文を試してみましたが、array_diffメソッドを操作できると思っていましたが、より良い方法を探していました。

$dif_keys = array_diff($fields, $headers); 
+2

キーだけが気になる場合は、代わりに 'array_diff_key()'が必要です。 – jeroen

+0

_ $ headers配列のキーが$ fields配列のどのキーとも一致しない場合、エラーを返したいと思います。しかし、 'phone'と' last_name'は両方とも一致していますので、基準を説明する必要がありますより良い。 – AbraCadaver

+0

@AbraCadaver $ headers配列のキーが$ fields配列のどのキーとも一致しない場合、エラーを返したいと思います。私はそれがより明確になるように質問を更新しました –

答えて

3

2つのこと:

  1. あなたはすべてのキー$headersから$fieldsに存在している場合は、チェックの代わりarray_diffarray_diff_keyを使用したい場合

    array_diffは値の比較のみを行います。

  2. 引数の順序を変更します。 diff関数は後続の引数には存在しない最初の引数の値を返します。したがって、$fieldsには$headersにないいくつかのキーが含まれていても問題がなければ、$headersを先に入れます。

    $diff = array_diff_key($headers, $fields); 
    

    あなたはブール値として$diff評価することができます。

だから私はあなたが必要とするコードがあると思います。 (例:if ($diff) {...)空の場合は、偽と評価されます。$headersのすべてのキーに対応するキーが$fieldsであることを意味します。

+0

ああ、私は近くにいると思う。実際はそうではなく、それを処理できる既存の機能があるという正しい考えを持っていました。 –

+0

I over thunk it :-( – AbraCadaver

+0

$フィールドのキーに例えばキーの部分があるとどうなりますか?$ headersには "ship_state"があり、$ fieldsには "state"があります。そのインスタンスがエラーまたはその違いを返すことは望ましくありません。 –

2

が交差するキーの数を確認し、$headersのカウントと比較:

if(count(array_intersect_key($headers, $fields)) == count($headers)) { 
    echo 'Good'; 
} else { 
    echo 'Bad'; 
} 

だから、これは$fieldsに存在している$header内のすべてのキーを返すと同じであるべき数を、比較しています。

関連する問題