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 に答える