2017-12-08 4 views
0

2つの配列を持ち、idをリストするインデックスが1つしかありません。他の配列には多くのインデックスがありますが、両方の配列のidインデックスだけを比較したいのですが、インデックスは[0]です.Iidが一致しない行だけを取得し、それらの行を返したいと考えています。例:2つの配列の最初のインデックスのみを比較する

$array1 = [ 
    '12345', 
    '23457' 
]; 

$array2 = [ 
    [id => '12345', 'fake_data' => 'something'], 
    [id => '23457', 'more_data' => 'something else'], 
    [id => '76389','more_data' => 'something else 3'], 
    [id => '10293', 'more_data' => 'something else 4'], 
    [id => '09229', 'more_data' => 'something else 5'] 
]; 

最初の配列にはidがあり、もう一方のidには他のデータが格納されています。私はそのデータを保持し、最初の配列と一致しない行だけを返す必要があります。ヘルプは非常にappriciatedです。

答えて

1
<?php 

$array1 = [ 
    '12345', 
    '23457' 
]; 

$array2 = [ 
    ['id' => '12345', 'fake_data' => 'something'], 
    ['id' => '23457', 'more_data' => 'something else'], 
    ['id' => '76389','more_data' => 'something else 3'], 
    ['id' => '10293', 'more_data' => 'something else 4'], 
    ['id' => '09229', 'more_data' => 'something else 5'] 
]; 

foreach($array2 as $key => $array) 
    if(array_search($array['id'], $array1) !== false) 
     unset($array2[$key]); 

var_export($array2); 

出力:

array (
    2 => 
    array (
     'id' => '76389', 
     'more_data' => 'something else 3', 
    ), 
    3 => 
    array (
     'id' => '10293', 
     'more_data' => 'something else 4', 
    ), 
    4 => 
    array (
     'id' => '09229', 
     'more_data' => 'something else 5', 
    ), 
) 
+0

Jaradの答えと同じように、条件式を 'if(in_array($ array ['id']、$ array1))'に置き換えることができます。 2番目の配列を変更したくない場合は、最初にコピーします。 – Progrock

2
$array1 = [ 
    '12345', 
    '23457' 
]; 

$array2 = [ 
    ['id' => '12345', 'fake_data' => 'something'], 
    ['id' => '23457', 'more_data' => 'something else'], 
    ['id' => '76389','more_data' => 'something else 3'], 
    ['id' => '10293', 'more_data' => 'something else 4'], 
    ['id' => '09229', 'more_data' => 'something else 5'] 
]; 

$found_id_rows = array_filter($array2, function($row) use($array1) { 
    return in_array($row['id'], $array1); 
}); 

$not_found_id_rows = array_filter($array2, function($row) use($array1) { 
    return !in_array($row['id'], $array1); 
}); 

は与える:

Array 
(
    [0] => Array 
     (
      [id] => 12345 
      [fake_data] => something 
     ) 

    [1] => Array 
     (
      [id] => 23457 
      [more_data] => something else 
     ) 

) 
Array 
(
    [2] => Array 
     (
      [id] => 76389 
      [more_data] => something else 3 
     ) 

    [3] => Array 
     (
      [id] => 10293 
      [more_data] => something else 4 
     ) 

    [4] => Array 
     (
      [id] => 09229 
      [more_data] => something else 5 
     ) 

) 

https://3v4l.org/6OVjP

+0

私はあなたに両方の投票をすることができればいいと思うが、私は最初の答えに投票しなければならない。私はどちらも3つの方法の両方を使用していませんでした。入力いただきありがとうございます。 –

0

私はそれがのように見えると思います2つの異なるタイプのアレイを有する図10に示す。さまざまな配列タイプを処理するには、array_uintersectを使用します。これはコールバックを使用してアイテム間の比較を定義します。彼らは$array1または$array2のいずれかから用語ことができるため、コールバックで

$result = array_uintersect($array2, $array1, function($a, $b) { 
    return ($a['id'] ?? $a) <=> ($b['id'] ?? $b); 
}); 

二つの用語($a['id'] ?? $a)($b['id'] ?? $b)はそのようなものです。

これが他の解決策より優れているか悪いかわかりませんが、それはそれを見るのとはちょっと違う方法です。

関連する問題