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方法更好,因为它没有循环更快。