我想验证一个数组是否只有“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;
}
我想这很好用,但是,我很好奇是否有一些我不知道的光滑数组转换功能会更好。有什么建议?感谢
答案 0 :(得分: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);
答案 1 :(得分: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 );
答案 2 :(得分:0)
可以使用以下组合重写您的功能:
array_intersect_key
删除额外的密钥array_merge
添加缺失的密钥array_map
将所有内容更改为NULL或整数但是,这只会让它变得复杂。 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
}