63098


**二次元配列$aと一次元配列$bを比較して、下記3つの条件分岐を行いたいです**

  * 条件1: $bの値が、$aの(特定キーの)値と一致する場合
  * 条件2: $bの値の一部が、$aの(特定キーの)値に含まれない場合
  * 条件3: $bの値の一部が$aの(特定キーの)値に含まれない、かつ $aの(特定キーの)値の一部が$bに含まれない場合

※何れも配列内の順番は問わない  
※返り値は、配列でも可

* * *

**条件1: $bの値が、$aの('z_id'キーの)値と一致する場合**  
TRUEを返す

[code]

    $a = array (
      0 => 
      array (
        'id' => '2',
        'x_id' => '1',
        'z_id' => '3',
      ),
      1 => 
      array (
        'id' => '1',
        'x_id' => '1',
        'z_id' => '2',
      ),
    )
    $b = array (
      0 => '3',
      1 => '2',
    )
    
[/code]

* * *

**条件2: $bの値の一部が、$aの('z_id'キーの)値に含まれない場合**  
$aの('z_id'キーの)値に含まれない$bの値を返す。下記例では2(後でINSERTで利用)

[code]

    $a = array (
      0 => 
      array (
        'id' => '2',
        'x_id' => '1',
        'z_id' => '3',
      )
    )
    $b = array (
      0 => '3',
      1 => '2',
    )
    
[/code]

* * *

**条件3: $bの値の一部が、$aの('z_id'キーの)値に含まれない、かつ $aの('z_id'キーの)値の一部が、$bに含まれない場合**  
aの('z_id'キーの)値が$bに含まれない該当二次元配列目の'id'の値を返す。下記例では2(後でDELETEで利用)  
$aの('z_id'キーの)値に含まれない$bの値を返す。下記例では2と3(後でINSERTで利用)

[code]

    $a = array (
      0 => 
      array (
        'id' => '2',
        'x_id' => '1',
        'z_id' => '4',
      )
    )
    $b = array (
      0 => '3',
      1 => '2',
    )
    
[/code]

* * *

**その他**  
・「条件2」は「条件3」に含まれますか？  
・「条件1」と「条件3」で場合分けして、「条件3」をさらに条件分けすれば良い？


CC BY-SA 4.0
2020-02-16T11:05:09.483
63092
2020-02-17T00:58:43.263
2020-02-17T00:58:43.263
3060
7886
question
php
PHPで一次元配列と二次元配列を比較して条件分岐したい


コメントで詳細をいただきましたので関数を作成してみました。  
質問にあった配列の書き方が5系でしたので5.6.29での確認になります。  
ループで回す方法もありますが、PHPではarray系の関数がありますので利用しています。特定のカラムの抽出には、array_column、配列の比較にはarray_intersectやarray_diffを用います。

[code]

    <?php
    
    function testmaster($a,$b)
    {
        $master = array_column($a,"z_id","id");//extract array(id=>z_id) from master
    
        $del = array_diff($master,$b);
        $ins = array_diff($b,$master);
    
        if(!empty($del)) $del = array_keys($del);//pick id of master
        if(!empty($ins)) $ins = array_values($ins);
    
        if(empty($del)&&empty($ins)) return TRUE;
        //
        return array($ins,$del);
    }
    
[/code]

テストコード込のサンプル

<http://sandbox.onlinephpfunctions.com/code/37b99cbbfb17c8247f96846a250c9f31067971e1>


CC BY-SA 4.0
2020-02-17T00:54:12.800
63098
2020-02-17T00:54:12.800
37777
63092
answer