Фильтровать массив по значениям в другом массиве с помощью PHP

У меня есть такой массив:

[
  {
    "Firepack_sn":"20012205",
    "Installation_Date":"",
    "Type":"EH","Standard":"VAS",
    "Capacity_m3h":"81",
    "Pressure_bar":"3,4",
    "Rpm":"2930",
    "Power_kw":"72"
  },
  {
    "Firepack_sn":"20023901",
    "Installation_Date":"",
    "Type":"DH","Standard":"VAS",
    "Capacity_m3h":"195",
    "Pressure_bar":"4,2",
    "Rpm":"2000",
    "Power_kw":"72"
  }
]

И массив2 так:

[
  {
    "user_id":"40009",
    "firepack_id":"20012205",
    "activated":"1"
  },
  {
    "user_id":"40009",
    "firepack_id":"21020393",
    "activated":"0"
  }
]

Теперь я хочу отфильтровать первый массив, поэтому я получаю только элемент с Firepack_sn, который существует в array2, как firepack_id

Поэтому я хочу, чтобы вывод был таким:

[
  {
    "Firepack_sn":"20012205",
    "Installation_Date":"",
    "Type":"EH","Standard":"VAS",
    "Capacity_m3h":"81",
    "Pressure_bar":"3,4",
    "Rpm":"2930",
    "Power_kw":"72"
  }
]

Как мне этого добиться?

2 ответа

Решение

Вот способ сделать это:

Во-первых, вам нужно извлечь firepack_id, который вам нужно найти, затем вам нужно перебрать $arr1 и проверить, совпадает ли Firepack_sn с одним из firepack_id, который вы извлекли ранее, и если да, то вы добавляете его в массив.

$arr1 = json_decode('[{"Firepack_sn":"20012205","Installation_Date":"","Type":"EH","Standard":"VAS","Capacity_m3h":"81","Pressure_bar":"3,4","Rpm":"2930","Power_kw":"72","Pump_Type":"KSB KFP50-200","Motor_Type":"DOOSAN PU066 VAS/CEA","Controller_Type":"WB882-E10 VAS","Pump_sn":"085259","Motor_sn":"EARPA209635","Controller_sn":"","Servicelevel":"","Cust_id":"0","Cust_branche":"","Cust_name":"","Cust_address1":"","Cust_zipcode":"","Cust_city":"","Cust_country":"","Cust_Phone":"","Cust_coachlevel":"","Site_Name":"E-set","Site_address1":"","Site_address2":"","Site_address3":"","Site_zipcode":"","Site_city":"","Site_country":"","Site_contact":"","Site_phone":"","activated":"1"},{"Firepack_sn":"20023901","Installation_Date":"","Type":"DH","Standard":"VAS","Capacity_m3h":"195","Pressure_bar":"4,2","Rpm":"2000","Power_kw":"72","Pump_Type":"KSB KFP50-200","Motor_Type":"DOOSAN PU066 VAS/CEA","Controller_Type":"WB882-E10 VAS","Pump_sn":"085259","Motor_sn":"EARPA209635","Controller_sn":"","Servicelevel":"","Cust_id":"0","Cust_branche":"","Cust_name":"","Cust_address1":"","Cust_zipcode":"","Cust_city":"","Cust_country":"","Cust_Phone":"","Cust_coachlevel":"","Site_Name":"D-set","Site_address1":"","Site_address2":"","Site_address3":"","Site_zipcode":"","Site_city":"","Site_country":"","Site_contact":"","Site_phone":"","activated":"0"}]');

$arr2 = json_decode('[{"user_id":"40009","firepack_id":"20012205","activated":"1"},{"user_id":"40009","firepack_id":"21020393","activated":"0"}]');

$firepackIds = array();
foreach($arr2 as $item){
  $firepackIds[] = $item->firepack_id;
}

$goodRows = array();
foreach($arr1 as $item){
  if(in_array($item->Firepack_sn, $firepackIds)){
    $goodRows[] = $item;
  }
}

echo json_encode($goodRows);

Надеюсь это поможет.

Вам не нужно несколько циклов или неэффективных итерацийin_array()звонки. PHP уже предлагает встроенную функцию для сравнения строк между несколькими 2D-массивами.array_uintersect(). Поскольку настраиваемый обратный вызов использует строки из любого массива при сравнении, вы должны построить логику обратного вызова для отката, чтобы потенциально использовать значение целевого столбца любого массива.

Код: (Демо)

      var_export(
    array_uintersect(
        $array1,
        $array2,
        fn($a, $b) =>
            ($a['Firepack_sn'] ?? $a['firepack_id'])
            <=>
            ($b['Firepack_sn'] ?? $b['firepack_id'])
    )
);

Выход:

      array (
  0 => 
  array (
    'Firepack_sn' => '20012205',
    'Installation_Date' => '',
    'Type' => 'EH',
    'Capacity_m3h' => '81',
    'Pressure_bar' => '3,4',
    'Rpm' => '2930',
    'Power_kw' => '72',
  ),
)
Другие вопросы по тегам