Php 如何检查和删除具有特定数据类型的数组值?
我有一个数组变量,它的格式和长度是不可预测的。例如:Php 如何检查和删除具有特定数据类型的数组值?,php,arrays,types,Php,Arrays,Types,我有一个数组变量,它的格式和长度是不可预测的。例如: $arrayData = array( 0 => (int) 100, 1 => (date) 2012-12-01, 2 => array( 0 => (string) 'some string', 1 => (int) 200, ), 3 => (string) 'another string' ); 我需要删除数组键及其值,只保留字符串数据
$arrayData = array(
0 => (int) 100,
1 => (date) 2012-12-01,
2 => array(
0 => (string) 'some string',
1 => (int) 200,
),
3 => (string) 'another string'
);
我需要删除数组键及其值,只保留字符串数据类型
也许有人可以建议我解决这个问题的正确方法,而不是使用loop和gettype
结果将是:
$arrayData = array(
2 => array(
0 => (string) 'some string',
),
3 => (string) 'another string'
);
或:
或其他建议结果是受欢迎的。为每个主数组检查每个值是否为字符串。 最后,您将得到一个只包含字符串的数组
foreach($arrayData as $key => $value){
if(is_string($value)){
$new[] = $value;
}
}
$new
将只包含字符串。对于每个主数组,检查每个值是否为字符串。
foreach($arrayData as $key => $value){
if(is_string($value)){
$new[] = $value;
}
}
最后,您将得到一个只包含字符串的数组
foreach($arrayData as $key => $value){
if(is_string($value)){
$new[] = $value;
}
}
$new
将只包含字符串。如果不想使用循环,则可以使用字符串
foreach($arrayData as $key => $value){
if(is_string($value)){
$new[] = $value;
}
}
<?php
$arrayData = array(
0 => (int) 100,
1 => (date) 2012-12-01,
2 => array(
0 => (string) 'some string',
1 => (int) 200,
),
3 => (string) 'another string'
);
array_walk_recursive($arrayData, 'test_print');
function test_print($value, $key)
{
//your code to remove
}
如果您不想使用循环,您可以使用
<?php
$arrayData = array(
0 => (int) 100,
1 => (date) 2012-12-01,
2 => array(
0 => (string) 'some string',
1 => (int) 200,
),
3 => (string) 'another string'
);
array_walk_recursive($arrayData, 'test_print');
function test_print($value, $key)
{
//your code to remove
}
您可以迭代数组并使用gettype()
函数保留/删除数组项。但是,您需要一个递归函数来处理数组中的数组。注意在下面的代码示例中小心地使用了两个&
:
$arrayData = array(
0 => (int) 100,
1 => '2012-12-01',
2 => array(
0 => (string) 'some string',
1 => (int) 200
),
3 => (string) 'another string'
);
function remove_nonstring_recursive(&$array) {
foreach ($array as $key => &$value) {
$type = gettype($value);
if ($type == "array") {
remove_nonstring_recursive($value);
} elseif ($type != "string") {
unset($array[$key]);
}
}
}
remove_nonstring_recursive($arrayData);
var_dump($arrayData);
// array(3) {
// [1]=>
// string(10) "2012-12-01"
// [2]=>
// array(1) {
// [0]=>
// string(11) "some string"
// }
// [3]=>
// string(14) "another string"
// }
原始答案-使用带有全局变量的array\u walk\u recursive
$arrayData = array(
0 => (int) 100,
1 => '2012-12-01',
2 => array(
0 => (string) 'some string',
1 => (int) 200
),
3 => (string) 'another string'
);
$arrayDataFiltered = array();
function remove_non_string($value, $key) {
global $arrayDataFiltered;
if (gettype($value) == "string") {
$arrayDataFiltered[] = $value;
}
}
array_walk_recursive($arrayData, "remove_non_string");
var_dump($arrayDataFiltered);
// array(3) {
// [0]=>
// string(10) "2012-12-01"
// [1]=>
// string(11) "some string"
// [2]=>
// string(14) "another string"
// }
您可以迭代数组,并使用gettype()
函数保留/删除数组项。但是,您需要一个递归函数来处理数组中的数组。注意在下面的代码示例中小心地使用了两个&
:
$arrayData = array(
0 => (int) 100,
1 => '2012-12-01',
2 => array(
0 => (string) 'some string',
1 => (int) 200
),
3 => (string) 'another string'
);
function remove_nonstring_recursive(&$array) {
foreach ($array as $key => &$value) {
$type = gettype($value);
if ($type == "array") {
remove_nonstring_recursive($value);
} elseif ($type != "string") {
unset($array[$key]);
}
}
}
remove_nonstring_recursive($arrayData);
var_dump($arrayData);
// array(3) {
// [1]=>
// string(10) "2012-12-01"
// [2]=>
// array(1) {
// [0]=>
// string(11) "some string"
// }
// [3]=>
// string(14) "another string"
// }
原始答案-使用带有全局变量的array\u walk\u recursive
$arrayData = array(
0 => (int) 100,
1 => '2012-12-01',
2 => array(
0 => (string) 'some string',
1 => (int) 200
),
3 => (string) 'another string'
);
$arrayDataFiltered = array();
function remove_non_string($value, $key) {
global $arrayDataFiltered;
if (gettype($value) == "string") {
$arrayDataFiltered[] = $value;
}
}
array_walk_recursive($arrayData, "remove_non_string");
var_dump($arrayDataFiltered);
// array(3) {
// [0]=>
// string(10) "2012-12-01"
// [1]=>
// string(11) "some string"
// [2]=>
// string(14) "another string"
// }
我现在不知道如何在没有递归的情况下实现它,但借助array_walk_recursive,您可以得到想要的:
<?php
$arrayData = array(
0 => 100,
1 => 2012-12-01,
2 => array(
0 => 'some string',
1 => 200,
),
3 => 'another string'
);
$objTmp = (object) array('flat' => array());
array_walk_recursive($arrayData, create_function('&$v, $k, &$t', '$t->flat[] = gettype($v);'), $objTmp);
var_dump($objTmp->Flat);
?>
我现在不知道如何在没有递归的情况下实现它,但是在数组\u walk\u recursive的帮助下,您可以得到想要的:
<?php
$arrayData = array(
0 => 100,
1 => 2012-12-01,
2 => array(
0 => 'some string',
1 => 200,
),
3 => 'another string'
);
$objTmp = (object) array('flat' => array());
array_walk_recursive($arrayData, create_function('&$v, $k, &$t', '$t->flat[] = gettype($v);'), $objTmp);
var_dump($objTmp->Flat);
?>
为什么不使用gettype呢。你想删除yo键[2]中的数组还是只删除(字符串)“某些字符串”?我不是肯定的,但这听起来像是递归可能出现的问题solve@ravz,只是想知道是否有php内置函数或其他漂亮的方式。是的,我想数组\u walk\u recursive就是你想要的。为什么不使用gettype呢。你想删除yo键[2]中的数组还是只删除(字符串)“某些字符串”?我不是肯定的,但这听起来像是递归可能出现的问题solve@ravz,我只是想知道是否有php内置函数或其他漂亮的方法。是的,我想你正在寻找的是数组\u walk\u recursive..你的prev方法更好,因为它没有循环更快。你的prev方法更好,因为它没有循环更快。