Фильтрация многомерного массива по равным значениям в подмассиве (PHP) - PullRequest
0 голосов
/ 24 октября 2018

Мне нужно отфильтровать многомерный массив по значению подмассива, который может каждый раз находиться на разных позициях.

Следующий массив

array(3) {
      [147]=>
      array(2) {
        [0]=>
        int(4)
        [1]=>
        string(3) "req"
      }
      [199]=>
      array(2) {
        [0]=>
        int(5)
        [1]=>
        string(3) "opt"
      }
      [212]=>
      array(3) {
        [0]=>
        int(2)
        [1]=>
        int(5)
        [2]=>
        string(3) "req"
      }

необходимо разделитьв эти массивы.

Массив 1:

array(2) {
      [147]=>
      array(2) {
        [0]=>
        int(4)
        [1]=>
        string(3) "req"
      }
      [212]=>
      array(3) {
        [0]=>
        int(2)
        [1]=>
        int(5)
        [2]=>
        string(3) "req"
      }

Массив 2:

array(1) {
      [199]=>
      array(2) {
        [0]=>
        int(5)
        [1]=>
        string(3) "opt"
      }

Я знаю о array_filter (), но не могу понять функцию внутри array_filter(), который дает мне желаемый результат.

Я пытался

$req = array_filter($my_array, function ($v, $k) {
    return $v == 'req';
}, ARRAY_FILTER_USE_BOTH);

Я также пытался

function filter_my_array($my_array, $search_term) {
  $new_array = array();
  foreach ($my_array as $subarray) {
    if (in_array($search_term, $subarray)) {
       $new_array[] = $subarray;
    }
  }
  return $new_array; 
} 

$req = filter_my_array($array, 'req');

Оба подхода не работают.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

С помощью фильтрации по необходимым значениям вы можете создать два массива.Вы можете использовать функцию array_filter, но вы должны найти необходимое значение в каждом элементе, который передан функции array_filter.

Например, поиск значения 'req'

$req = array_filter($my_array, function ($v) {
    return in_array('req', $v);
});

Например, поиск значения 'opt'

$opt = array_filter($my_array, function ($v) {
    return in_array('opt', $v);
});

Я использовал функцию in_array для поиска значений, поскольку каждый элементмассив, который имеет разное количество элементов

0 голосов
/ 24 октября 2018

Мне кажется, это работает:

function filter_my_array($my_array, $search_term) {
    $required_array = [];
    $filtered_array = [];
    foreach ($my_array as $key => $subarray) {
        $found_flag = false;
        foreach ($subarray as $cur_subarray) {
            if ($cur_subarray == $search_term) {
                $found_flag = true;
                break;
            }
        }

        if ($found_flag == true) {
            $required_array[$key] = $subarray;
        } else {
            $filtered_array[$key] = $subarray;
        }
    }

    return [$required_array, $filtered_array];
}

Чтобы получить требуемый массив и отфильтрованный массив, вызовите функцию следующим образом:

list($required_array, $filtered_array) = filter_my_array($my_array, 'req');

, где $ my_array содержит массивв вашем примере.

...