簡體   English   中英

如何在php中過濾鍵值匹配的數組

[英]how to filter array where a key's value matches in php

我不確定如何執行此操作,但我想在迭代另一組數據結果時過濾一組數據結果。 這樣做的正確方法是什么? 我正在嘗試 array_filter,但我不確定我是否掌握如何使這項工作類似於 sql where 語句:編輯:這些下面的查詢是對 MySQL 數據庫的

    $arr_years = $wpdb->get_results("SELECT id, submodel_id, year FROM `subyears` ORDER by submodel_id", ARRAY_A);
    $arr_submodels = $wpdb->get_results("SELECT id, model_id, sub_name FROM `submodels` ORDER by model_id", ARRAY_A);
    foreach($arr_submodels as $submodel){
        $filtered = array_filter($arr_years, function ($value,$key){
            return $value == $submodel->id && $key == 'year';
        });
    //do something with $filtered here
    }

基本上我想要相當於“where submodel_id == id of the other array”。 我認為 array_map 可能會做我想做的,但我也不明白,但如果這是更好的方法,請告訴我並告訴我如何做? 謝謝。

編輯:添加了數組的示例輸出片段:$arr_years:

array(50) { [0]=> array(3) { ["id"]=> string(1) "1" ["submodel_id"]=> string(1) "2" ["year"]=> string(4) "2020" } [1]=> array(3) { ["id"]=> string(1) "2" ["submodel_id"]=> string(1) "3" ["year"]=> string(4) "2020" } [2]=> array(3) { ["id"]=> string(1) "3" ["submodel_id"]=> string(1) "4" ["year"]=> string(4) "2020" } [3]=> array(3) { ["id"]=> string(1) "4" ["submodel_id"]=> string(1) "5" ["year"]=> string(4) "2020" } [4]=> array(3) { ["id"]=> string(1) "5" ["submodel_id"]=> string(1) "6" ["year"]=> string(4) "2020" } }

$arr_submodels:

array(50) { [0]=> array(3) { ["id"]=> string(1) "2" ["model_id"]=> string(2) "22" ["sub_name"]=> string(13) "RMK KHAOS 155" } [1]=> array(3) { ["id"]=> string(1) "3" ["model_id"]=> string(2) "22" ["sub_name"]=> string(7) "RMK 144" } [2]=> array(3) { ["id"]=> string(1) "4" ["model_id"]=> string(2) "22" ["sub_name"]=> string(11) "PRO-RMK 155" } [3]=> array(3) { ["id"]=> string(1) "5" ["model_id"]=> string(2) "22" ["sub_name"]=> string(11) "PRO-RMK 163" } [4]=> array(3) { ["id"]=> string(1) "6" ["model_id"]=> string(2) "22" ["sub_name"]=> string(11) "PRO-RMK 174" } [5]=> array(3) { ["id"]=> string(1) "7" ["model_id"]=> string(2) "23" ["sub_name"]=> string(7) "SKS 146" } }

我不在 sql 中執行此操作的原因是我需要從年份表中為每個子模型 ID 創建一個以逗號分隔的年份列表……這是多對一的關系。

謝謝

根據新信息,這就是您可能想要的:

$arr = $wpdb->get_results("
  SELECT GROUP_CONCAT(sy.year) as years,
  sm.model_id as model_id,
  sm.sub_name as sub_name
  FROM `subyears` sy
  JOIN `submodels` sm
  ON sy.submodel_id=sm.id
  GROUP BY sm.model_id
  ORDER BY sm.model_id
");

返回數組中的“年份”列將包含所有年份。 默認情況下,它們以逗號分隔。

---下面的舊答案---

您應該在查詢本身中執行此操作:

$arr = $wpdb->get_results("
  SELECT sy.id, sy.year, sm.id, sm.model_id, sm.sub_name
  FROM `subyears` sy
  JOIN `submodels` sm
  ON sy.submodel_id=sm.id
  ORDER BY sm.model_id
");

如果您真的堅持在查詢之外執行此操作,則需要創建一個全新的數組:

$arr = array();
foreach($arr_years as $year)
  foreach($arr_submodels as $submodel)
    if($year->submodel_id == $submodel->id)
      $arr[] = (object) array_merge((array) $year, (array) $submodel));

現在,$arr 包含合並在一起的兩個數組中的所有對象,其中 submodel_id == id。 你可以遍歷 $arr 並做你想做的。

我使用 array_merge 是因為我不知道任何合並對象的函數。 如果有的話,效率會更高。

暫無
暫無

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

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