Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中从数组中提取特定类型的元素_Php_Arrays_Array Filter - Fatal编程技术网

在PHP中从数组中提取特定类型的元素

在PHP中从数组中提取特定类型的元素,php,arrays,array-filter,Php,Arrays,Array Filter,我有一个从Excel文件中获得的多维数组(从单元格中提取的原始数据,没有任何格式、样式信息等)。阵列示例: array(1) { [0]=> array(4) { [1]=> array(1) { ["A"]=> string(5) "aaaaa" } [2]=> array(1) { ["A"]=> NULL } [3]=> array(1

我有一个从Excel文件中获得的多维数组(从单元格中提取的原始数据,没有任何格式、样式信息等)。阵列示例:

array(1) {
  [0]=>
  array(4) {
    [1]=>
    array(1) {
      ["A"]=>
      string(5) "aaaaa"
    }
    [2]=>
    array(1) {
      ["A"]=>
      NULL
    }
    [3]=>
    array(1) {
      ["A"]=>
      NULL
    }
    [4]=>
    array(1) {
      ["A"]=>
      float(666)
    }
  }
} 
字符串型单元格表示输入到工作表单元格中的普通文本,而浮点型单元格表示在工作表单元格中输入的数字

是否有任何方法可以从这样的数组中提取“字符串”和“浮点”?或者,是否至少可以根据数组元素的类型从数组中删除所有/过滤掉其他信息,只保留“string”和“float”元素


谢谢大家!

只需递归检查数组项,并删除非字符串、浮点或带有数据的数组项

代码示例:

<?php
$data = [
    [
        ['A' => 'aaaaa'],
        ['A' => null],
        ['A' => null],
        ['A' => (float)666]
    ]
];

function filterData($array)
{
    foreach ($array as $key => &$value) {
        if (is_array($value))
            $value = filterData($value);

        if ($value === [] || (!is_array($value) && !is_string($value) && !is_float($value)))
            unset($array[$key]);
    }

    return $array;
}
var_dump(filterData($data));

/* result
array(1) {
  [0]=>
  array(2) {
    [0]=>
    array(1) {
      ["A"]=>
      string(5) "aaaaa"
    }
    [3]=>
    array(1) {
      ["A"]=>
      float(666)
    }
  }
}
*/

作为替代方法,您可以在array\u filter的回调中使用and和的组合,检查值是否为浮点或字符串:

$arrays = [
    [
        ['A' => 'aaaaa'],
        ['A' => null],
        ['A' => null],
        ['A' => (float)666]
    ]
];

$arrays = array_map(function($x) {
    return array_filter($x, function($y) {
        return is_float($y['A']) || is_string($y['A']);
    });
}, $arrays);

var_dump($arrays);

这将导致:

array(1) {
  [0]=>
  array(2) {
    [0]=>
    array(1) {
      ["A"]=>
      string(5) "aaaaa"
    }
    [3]=>
    array(1) {
      ["A"]=>
      float(666)
    }
  }
}

您可以始终使用
is_string()
is_float()
等来完成整个过程。您可以将数组过滤器与Loek建议一起使用。文档的链接。