2012-11-28 3 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 
); 

이없는 경우 I는 다음과 같은 일을 할 수 있지만, 읽기가 조금 어렵고, 큰 될 것입니다 다음

$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

'for' 루프 대신'array_map'을 사용할 수 있습니다. –

답변

0

재 할 수 있습니다 다음의 조합을 사용하여 함수를 작성하십시오 :

을 변경할 수없는 키

  • array_map를 추가하는 추가 키
  • array_merge를 제거합니다. 매끄러운 방법은 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

    배열지도

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

    또는 키 http://php.net/manual/en/function.array-map.php가,

    $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

    여기에 가능한 솔루션입니다을 ... array_walk 좋은

    // 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); 
    
    관련 문제