从 PHP 中的数组中提取某种类型的元素
Extract elements of certain type from an array in PHP
我有一个从 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)
}
}
}
字符串型单元格代表输入到工作表单元格中的普通文本,而浮点型单元格代表输入的数字。
有什么方法可以从这样的数组中提取 'strings' 和 'floats' 吗?或者,至少可以根据元素的类型从数组中删除 all/filter 其他信息,只留下 '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_map and array_filter 的组合,并在 array_filter 的回调中检查值是浮点数还是字符串:
$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)
}
}
}
我有一个从 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)
}
}
}
字符串型单元格代表输入到工作表单元格中的普通文本,而浮点型单元格代表输入的数字。
有什么方法可以从这样的数组中提取 'strings' 和 'floats' 吗?或者,至少可以根据元素的类型从数组中删除 all/filter 其他信息,只留下 '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_map and array_filter 的组合,并在 array_filter 的回调中检查值是浮点数还是字符串:
$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)
}
}
}