2012-11-28 39 views
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; 
} 

我想这个工作足够好,但是,好奇是否有一些光滑的数组转换函数,我不知道这会更好。有什么建议?由于

+1

所以,你想要什么,是要合并的阵列? http://php.net/manual/en/function.array-merge.php –

+0

@feeela $ arr ['a'] = 123; – user1032531

+0

您可以使用'array_map'而不是'for'循环。 –

回答

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 
} 
+0

不知道我会不会这样做,但我的问题是最清晰的方式,我同意这是最光滑的方式! – user1032531

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); 
+0

这将确保它们是整数,但不能确保所有必需的密钥都存在,或者是否包含任何额外的密钥。 – user1032531

+0

我已经调整为包含array_walk现在,它应该考虑到密钥。 –

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);