0

我想验证一个数组是否具有并且只有“a”、“b”和“c”作为关联键,并且值是整数或 NULL 或 0(更容易)。

例如,array('a'=>123,'b'=>'abc', 'd'=>321)应转换为array('a'=>123,'b'=>0, 'c'=>0).

我可以做类似下面的事情,但它有点难以阅读,如果我不只是有 3 个元素而是 300 个元素,它会变得很大。

$newArr=array(
 'a'=>(isset($arr['a']))?(int)$arr['a']:0,
 'b'=>(isset($arr['b']))?(int)$arr['b']:0,
 'c'=>(isset($arr['c']))?(int)$arr['c']:0
);

另一种选择类似于以下内容:

$newArr=array();
foreach (array('a','b','c') as $key)
{
 $newArr[$key]=(isset($arr[$key]))?(int)$arr[$key]:0;
}

我想这已经足够好了,但是,我很好奇是否有一些我不知道的光滑的数组转换功能会更好。有什么建议吗?谢谢

4

3 回答 3

0

数组映射很好http://php.net/manual/en/function.array-map.php

$arr = array('a'=>123,'b'=>'abc', 'd'=>321);
function intize($n){return (int)$n;}

$arr = array_map("intize",$arr);
print_r($arr);

或者对于键,array_walk

$arr = array('a'=>123,'b'=>'abc', 'd'=>321);
function intize(&$n,$key){
    if($key =='a'||$key=='b'||$key=='c')
        $n= (int)$n;
    else
        unset($n);
}

array_walk($arr,"intize");
print_r($arr);
于 2012-11-28T15:42:54.717 回答
0

这是一个可能的解决方案...

// create array of required keys with default values
$defaultKeys = array('a','b','c');
$defaultVals = array_fill(0, count($defaultKeys), 0); 
$defaults = array_combine($defaultKeys, $defaultVals);

$args = array('a'=>123,'b'=>'abc', 'd'=>321);

// merge arguments with defaults, overwriting default values with arg values and preserving keys
$args = array_merge($defaults, $args);

// remove key/value pairs present in args that don't exist in defaults 
$args = array_intersect_key($args, $defaults);

// filter values, replacing anything that isn't an integer of 0 or greater value with a 0
$args = array_map( function($v) { return (is_integer($v) && $v >= 0) ? $v : 0; }, $args );
于 2012-11-28T15:56:24.823 回答
0

可以使用以下组合重写您的函数:

然而,这只会使它变得复杂。IMO 最巧妙的方法是:

$test = array("a" => 123, "b" => "x", "d" => 123);
$testcopy = array();
foreach (array("a", "b", "c") as $key) {
    $testcopy[$key] = array_key_exists($key, $test)
        ? filter_var($test[$key], FILTER_VALIDATE_INT, array("options" => array("default" => NULL)))
        : NULL;
}
var_dump($testcopy);

输出:

array(3) {
    ["a"]=> int(123)
    ["b"]=> NULL
    ["c"]=> NULL
}
于 2012-11-28T15:57:08.017 回答