как отфильтровать массив, где значение ключа соответствует php - PullRequest
0 голосов
/ 10 января 2020

Я не уверен, как это сделать, но я хотел бы отфильтровать один набор результатов данных, перебирая другой. Как правильно это сделать? Я пытаюсь array_filter, но я не уверен, что gr asp как сделать эту работу похожей на оператор sql where: edit: Эти ниже запросы относятся к MySQL database

    $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
    }

В основном я хочу эквивалент "где submodel_id == идентификатор другого массива". Я думаю, что array_map может делать то, что я хочу, но я тоже не asp, но если это лучший способ, пожалуйста, дайте мне знать и покажите, как? Спасибо.

Редактировать: добавлен пример выходных фрагментов массива: $ 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 - мне нужно создать список лет с разделителями-запятыми из таблицы лет для каждого идентификатора подмодели ... это отношение много-к-одному.

Спасибо

1 Ответ

1 голос
/ 10 января 2020

Основываясь на новой информации, вы, вероятно, захотите:

$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. Вы можете l oop через $ arr и делать то, что вы хотите.

Я использовал array_merge, потому что я не знаю ни одной функции для объединения объектов. Если он есть, он будет более эффективным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...