0

我有数组变量,它是不可预测的格式和长度。例如:

$arrayData = array(
   0 => (int) 100,
   1 => (date) 2012-12-01,
   2 => array(
       0 => (string) 'some string',
       1 => (int) 200,
   ),
   3 =>  (string) 'another string'
);

我需要删除数组键和它的值并只保留字符串数据类型。

也许有人可以建议我解决该问题的正确方法,而不是使用循环和 gettype。

结果将是:

$arrayData = array(
   2 => array(
       0 => (string) 'some string',
   ),
   3 =>  (string) 'another string'
);

或者:

$arrayData = array(
   0 => (string) 'some string',
   1 =>  (string) 'another string'
);

或其他建议结果欢迎。

4

4 回答 4

3

如果您不想使用循环,则可以使用array_walk_recursive 。

<?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
}
于 2012-12-21T08:06:03.973 回答
1

您可以遍历数组并使用该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_walk_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"
// }
于 2012-12-21T08:09:28.317 回答
1

我现在不知道如何在没有递归的情况下做到这一点,但是在 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);
?>
于 2012-12-21T08:13:47.403 回答
0

foreach 主数组并检查每个值是否为字符串。最后,您将拥有一个仅包含字符串的数组。

foreach($arrayData as $key => $value){
    if(is_string($value)){
    $new[] = $value;
    }
}

$new将只有字符串。

于 2012-12-21T08:03:53.080 回答