Фильтровать массив по значениям в другом массиве с помощью 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',
),
)