通过子数组(PHP)中的相等值过滤多维数组

时间:2018-10-24 09:05:15

标签: php arrays multidimensional-array array-filter

我需要用子数组的值过滤多维数组,子数组的值每次可能都在不同的位置。

以下数组

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 :(得分:2)

您可以通过按必要的值进行过滤来创建两个数组。您可以对其使用array_filter函数,但是您应该在传递给array_filter函数的每个元素中找到一个必要的值。

例如,找到“ req”值

<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ // Copyright 2018 Vorlonsoft LLC
  ~ //
  ~ // Licensed under The MIT License (MIT)
-->
<resources>

    <!-- Base Apple and Modern types Rate Dialog theme. -->
    <style name="RateDialogTransparentTheme">
        <item name="android:background">@color/rateDialogColorTransparent</item>
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:backgroundDimAmount">0.4</item>
        <item name="android:colorBackgroundCacheHint">@null</item>
        <item name="android:windowBackground">@color/rateDialogColorTransparent</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowFrame">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowTitleStyle">@null</item>
    </style>

</resources>

例如,找到“ opt”值

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

我使用in_array函数来查找值,因为每个元素都是具有不同数量元素的数组

答案 1 :(得分:0)

这似乎对我有用:

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用于保存示例中的数组。