簡體   English   中英

通過匹配關聯數組中的一個或多個鍵值對來過濾數組行

[英]Filter array rows by matching one or more key-value pairs in associative array

認為,

$data = array(
   array('id' => 1, 'user_id' => 1, 'assignment_id' => 1, 'grade' => 90),
   array('id' => 2, 'user_id' => 3, 'assignment_id' => 2, 'grade' => 85),
   array('id' => 3, 'user_id' => 5, 'assignment_id' => 5, 'grade' => 66),
);

現在我想過濾如下行:

$rules = array(
    'user_id' => 5,
    'assignment_id' => 5
);

這應該返回$data[2]處的行。

$rules = array(
    'user_id' => 3,
    'assignment_id' => 2,
    'grade' => 85
);

將返回$data[1]

這里的keys順序在$data元素和$rules中可能不同。

我嘗試使用array_intersect ,但這對我不起作用。

如果你只需要返回的元素列表$data符合過濾條件其中,可以使用的組合array_filter()array_intersect_assoc()來完成這項工作:

// build an array of your filtering criteria
$filter_array = array(
   'user_id' => 3,
   'assignment_id' => 5
);

// filter the array
$filtered_array = array_filter($data, function ($val_array) use ($filter_array) {
    $intersection = array_intersect_assoc($val_array, $filter_array);
    return (count($intersection)) === count($filter_array);
});

請注意,您需要PHP> = 5.3.0才能使用匿名函數,如圖所示。

這是一種更現代、更優雅的方法。

使用箭頭函數語法允許$rules進入自定義函數的范圍。 按每個遇到的行關聯地過濾規則數組,然后如果規則數組與關聯過濾的規則數組相同,則返回真正的評估。

代碼:(演示

$data = [
   ['id' => 1, 'user_id' => 1, 'assignment_id' => 1, 'grade' => 90],
   ['id' => 2, 'user_id' => 3, 'assignment_id' => 2, 'grade' => 85],
   ['id' => 3, 'user_id' => 5, 'assignment_id' => 5, 'grade' => 66],
];

$rules = ['user_id' => 3, 'assignment_id' => 2];

var_export(
    array_filter(
        $data,
        fn($row) => $rules === array_intersect_assoc($rules, $row)
    )
);

輸出:

array (
  1 => 
  array (
    'id' => 2,
    'user_id' => 3,
    'assignment_id' => 2,
    'grade' => 85,
  ),
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM