获取多维数组中的元素计数并指定过滤器

问题描述 投票:0回答:3

我想获取多维数组中

country
记录的计数。 我也想获得相同的计数,但按记录过滤,因此
count
the Netherlands

我试过这个:

$total = array_sum(array_map("count", $data));
echo "total: " . $total;

它计算数组中的记录数。

我已经尝试过:

$element = 'institutionID';
$count = array_count_values(array_column($data, 'institutionID'))[$element];
echo $count;

但是什么也没有返回。我该怎么做?

数据示例

Array
(
    [0] => Array
        (
            [higherGeographyID] => http://vocab.getty.edu/tgn/7016845
            [higherGeography] => None
            [continent] => Europe
            [waterBody] => None
            [islandGroup] => None
            [island] => None
            [country] => The Netherlands
            [countryCode] => NL
            [stateProvince] => Groningen
            [county] => Groningen
            [municipality] => Groningen
            [locality] => Groningen
            [verbatimLocality] => None
            [minimumElevationInMeters] => None
            [maximumElevationInMeters] => None
            [verbatimElevation] => None
            [minimumDepthInMeters] => None
            [maximumDepthInMeters] => None
            [verbatimDepth] => None
            [minimumDistanceAboveSurfaceInMeters] => None
            [maximumDistanceAboveSurfaceInMeters] => None
            [locationAccordingTo] => None
            [locationRemarks] => None
            [decimalLatitude] => None
            [decimalLongitude] => None
            [geodeticDatum] => None
            [coordinateUncertaintyInMeters] => None
            [coordinatePrecision] => None
            [pointRadiusSpatialFit] => None
            [verbatimCoordinates] => None
            [verbatimLatitude] => None
            [verbatimLongitude] => None
            [verbatimCoordinateSystem] => None
            [verbatimSRS] => None
            [footprintWKT] => None
            [footprintSRS] => None
            [footprintSpatialFit] => None
            [georeferencedBy] => None
            [georeferencedDate] => None
            [georeferenceProtocol] => None
            [georeferenceSources] => None
            [georeferenceVerificationStatus] => None
            [georeferenceRemarks] => None
          
        )

    [1] => Array
        (
            ...
php arrays multidimensional-array count filtering
3个回答
3
投票

country
条记录数:

$dataCountry = array_column($data, 'country');
echo "total: ", count($dataCountry);

The Netherlands
计数:

$dataCountryCount = array_count_values(array_filter($dataCountry));
echo $dataCountryCount['The Netherlands'] ?? 0;

多重搜索过滤器:

$filter = ['country' => 'The Netherlands', 'continent' => 'Europe'];
$dataFilter = array_filter($data, function($item) use ($filter) {
    return $filter == array_intersect_key($item, $filter);
});
echo 'total:', count($dataFilter);

print_r($dataFilter);

0
投票

您可以尝试以下操作:

  $data = json_decode($data_json,true);

  echo count_filtered_by($data);
  // Returns (int) 3
  echo count_filtered_by($data,'country');
  // Returns (int) 3
  echo count_filtered_by($data,'country','The Netherlands');
  // Retruns (int) 2
  echo count_filtered_by($data,'country','UK');
  // Returns (int) 1
  echo count_filtered_by($data,'country','uK',true);
  // Returns (int) 0

  /**
  * Count filtered by
  * 
  * @param array $data
  * @param string|nullable $key
  * @param string|nullable $value
  * @param bool $strict Default is (Case Insensitive)
  * 
  * @return int count filtered by
  */
  function count_filtered_by($data,$key = NULL,$value = NULL,$strict = false) {
    $column = array_column($data,$key);
    if($key === NULL) return count($data);
    if($value === NULL ) return count($column);
    // Remove empty values
    $filtered = array_filter($column);

    $count = 0;
    foreach($filtered as $column) {
      if(!$strict) {
        $column = strtolower($column);
        $value = strtolower($value);
      }
      if($column === $value) $count++;
    }

    return $count;
  }

所以我在这里测试你的数据

  $data_json = '[
      {
          "higherGeographyID": "http:\/\/vocab.getty.edu\/tgn\/7016845",
          "higherGeography": "None",
          "continent": "Europe",
          "waterBody": "None",
          "islandGroup": "None",
          "island": "None",
          "country": "The Netherlands",
          "countryCode": "NL",
          "stateProvince": "Groningen",
          "county": "Groningen",
          "municipality": "Groningen",
          "locality": "Groningen",
          "verbatimLocality": "None",
          "minimumElevationInMeters": "None",
          "maximumElevationInMeters": "None",
          "verbatimElevation": "None",
          "minimumDepthInMeters": "None",
          "maximumDepthInMeters": "None",
          "verbatimDepth": "None",
          "minimumDistanceAboveSurfaceInMeters": "None",
          "maximumDistanceAboveSurfaceInMeters": "None",
          "locationAccordingTo": "None",
          "locationRemarks": "None",
          "decimalLatitude": "None",
          "decimalLongitude": "None",
          "geodeticDatum": "None",
          "coordinateUncertaintyInMeters": "None",
          "coordinatePrecision": "None",
          "pointRadiusSpatialFit": "None",
          "verbatimCoordinates": "None",
          "verbatimLatitude": "None",
          "verbatimLongitude": "None",
          "verbatimCoordinateSystem": "None",
          "verbatimSRS": "None",
          "footprintWKT": "None",
          "footprintSRS": "None",
          "footprintSpatialFit": "None",
          "georeferencedBy": "None",
          "georeferencedDate": "None",
          "georeferenceProtocol": "None",
          "georeferenceSources": "None",
          "georeferenceVerificationStatus": "None"
      },
      {
          "higherGeographyID": "http:\/\/vocab.getty.edu\/tgn\/7016845",
          "higherGeography": "None",
          "continent": "Europe",
          "waterBody": "None",
          "islandGroup": "None",
          "island": "None",
          "country": "The Netherlands",
          "countryCode": "NL",
          "stateProvince": "Groningen",
          "county": "Groningen",
          "municipality": "Groningen",
          "locality": "Groningen",
          "verbatimLocality": "None",
          "minimumElevationInMeters": "None",
          "maximumElevationInMeters": "None",
          "verbatimElevation": "None",
          "minimumDepthInMeters": "None",
          "maximumDepthInMeters": "None",
          "verbatimDepth": "None",
          "minimumDistanceAboveSurfaceInMeters": "None",
          "maximumDistanceAboveSurfaceInMeters": "None",
          "locationAccordingTo": "None",
          "locationRemarks": "None",
          "decimalLatitude": "None",
          "decimalLongitude": "None",
          "geodeticDatum": "None",
          "coordinateUncertaintyInMeters": "None",
          "coordinatePrecision": "None",
          "pointRadiusSpatialFit": "None",
          "verbatimCoordinates": "None",
          "verbatimLatitude": "None",
          "verbatimLongitude": "None",
          "verbatimCoordinateSystem": "None",
          "verbatimSRS": "None",
          "footprintWKT": "None",
          "footprintSRS": "None",
          "footprintSpatialFit": "None",
          "georeferencedBy": "None",
          "georeferencedDate": "None",
          "georeferenceProtocol": "None",
          "georeferenceSources": "None",
          "georeferenceVerificationStatus": "None"
      },
      {
          "higherGeographyID": "http:\/\/vocab.getty.edu\/tgn\/7016845",
          "higherGeography": "None",
          "continent": "Europe",
          "waterBody": "None",
          "islandGroup": "None",
          "island": "None",
          "country": "UK",
          "countryCode": "UK",
          "stateProvince": "Groningen",
          "county": "Groningen",
          "municipality": "Groningen",
          "locality": "Groningen",
          "verbatimLocality": "None",
          "minimumElevationInMeters": "None",
          "maximumElevationInMeters": "None",
          "verbatimElevation": "None",
          "minimumDepthInMeters": "None",
          "maximumDepthInMeters": "None",
          "verbatimDepth": "None",
          "minimumDistanceAboveSurfaceInMeters": "None",
          "maximumDistanceAboveSurfaceInMeters": "None",
          "locationAccordingTo": "None",
          "locationRemarks": "None",
          "decimalLatitude": "None",
          "decimalLongitude": "None",
          "geodeticDatum": "None",
          "coordinateUncertaintyInMeters": "None",
          "coordinatePrecision": "None",
          "pointRadiusSpatialFit": "None",
          "verbatimCoordinates": "None",
          "verbatimLatitude": "None",
          "verbatimLongitude": "None",
          "verbatimCoordinateSystem": "None",
          "verbatimSRS": "None",
          "footprintWKT": "None",
          "footprintSRS": "None",
          "footprintSpatialFit": "None",
          "georeferencedBy": "None",
          "georeferencedDate": "None",
          "georeferenceProtocol": "None",
          "georeferenceSources": "None",
          "georeferenceVerificationStatus": "None"
      }
  ]';

0
投票

如果我理解正确,你可以这样做:

//Example data for testing
$arr = [
    ['a'=> ['country' => 'Netherland']],
    ['e'=> ['country' => 'Netherland']],
    ['b'=> ['country' => 'Sweden']],
    ['c'=> ['country' => 'Netherland'], 'a' => ['country' => 'Netherland']],
    ['f'=> ['country' => 'Sweden']],
];

//Init som global variables 
$count_countries = 0; //Number of occurences of 'country'
$check_country = 'Netherland'; //What country to check
$count_country = 0; //Number of occurences for chosen country to check

//Walk through array recursively and count each found occurence of 
//country and the actual country to check
array_walk_recursive($arr, function($item, $key) {
    global $count_countries, $count_country, $check_country;
    if ($key == 'country') $count_countries++;
    if ($item == $check_country) $count_country++;
});

//Output result
echo 'count for ' . $check_country . ' = ' . $count_country . '<br>';
echo 'count for countries = ' . $count_countries;

这种情况的结果:

count for Netherland = 4
count for countries = 6
© www.soinside.com 2019 - 2024. All rights reserved.