2016-07-08 11 views
2

간단히 말해 두 개의 간단한 배열이 있는데 두 번째 배열의 특정 키에 빈 값이 있는지 확인한 다음 첫 번째 배열의 해당 값으로 바꿉니다.PHP 다차원 배열의 특정 요소를 비교하고 변경하십시오.

예 :

$a1 = [ 1 => 'one', 2 => 'two', 3 => 'three',5=>'cinco', 6=>'six']; 
$a2 = [ 2 => 'two', 5=>'five', 6=>'' ]; 

결과 :

Array 
(
    [2] => two 
    [5] => five 
    [6] => six 
) 

다음 코드는이 이미 작동합니다.

$keys = array_keys($a1); 
foreach ($keys as $k) 
{ 
    if ((isset($a2[$k])) && (($a2[$k]) == '')) { 
    $a2[$k] = $a1[$k]; 
    } 
} 
print_r($a2); 

하지만 두 개의 2D 배열에 이것을 적용하려면 어떻게해야합니까? 이 경우 적절한 접근 방법은 무엇입니까? 의이 두 차원 배열이 될 것입니다 가정 해 봅시다 :

$superheroes_complete = array(
    "spiderman" => array(
     "name" => "Peter Parker", 
     "email" => "[email protected]", 
    ), 
    "superman" => array(
     "name" => "Clark Kent", 
     "email" => "[email protected]", 
    ), 
    "ironman" => array(
     "name" => "Harry Potter", 
     "email" => "[email protected]", 
    ) 
); 

$superheroes_empty = array(
    "spiderman" => array(
     "name" => "Peter Parker", 
     "email" => "", 
    ), 
    "superman" => array(
     "name" => "Clark Kent", 
     "email" => "something", 
    ), 
    "ironman" => array(
     "name" => "Harry Potter", 
     "email" => "another one", 
    ) 
); 

기대 :

$superheroes = array(
    "spider-man" => array(
     "name" => "Peter Parker", 
     "email" => "[email protected]", 
    ), 
    "super-man" => array(
     "name" => "Clark Kent", 
     "email" => "something", 
    ), 
    "iron-man" => array(
     "name" => "Harry Potter", 
     "email" => "another one", 
    ) 
); 

많은 감사 사전에 감사합니다! 당신은 단지 "이메일 알아서해야하는 경우

foreach ($superheroes_complete as $hero => $info) { 
    foreach ($info as $key => $value) { 
     if (empty($superheroes_empty[$hero][$key])) { 
      $superheroes_empty[$hero][$key] = $value; 
     } 
    } 
} 
+0

루프 용으로 중첩 – ebyt

답변

1

당신은 당신의 데이터를 다른 레벨을 추가했습니다 "필드 당신은이 작업을 수행 할 수 있습니다

<?php 
$keys = array_keys($superheroes_complete); 
foreach ($keys as $k) 
{ 
    if ((isset($superheroes_empty[$k]["email"])) && 
     (($superheroes_empty[$k]["email"]) == '')) { 
    $superheroes_empty[$k]["email"] = $superheroes_complete[$k]["email"]; 
    } 
} 
var_dump($superheroes_empty); 
?> 
+0

대단히 감사합니다! 완벽하게 작동합니다. – Alberto

+0

당신을 진심으로 환영합니다. –

+0

그러나 간단한 배열과 2D 배열을 갖는 상황이 있다면 어떻게해야할까요? 간단한 어레이 :'$ superheroes_complete = array (1 => 'one', 2 => 'two', 3 => 'three', 5 => 'cinco', 6 => 'six', 'email '=>'[email protected] ');' 2 차원 배열 : '$의 superheroes_empty = 배열 ​​( "스파이더 맨"=> 배열 ( "이름"=> "피터 파커" "이메일"= > "" )를 "슈퍼맨"=> 배열 ( "이름"=> "클라크 켄트" "이메일"=> "뭔가", ), "아이언 맨"=> 배열 ( "이름 "=>"Harry Potter ", "email "=>"another one ", ) ); ' – Alberto

0

: 당신은 그냥 두 번째 foreach 루프뿐만 아니라 당신의 검사에 다른 레벨을 추가 할 수 있도록

+1

감사합니다! 이것은 또한 작동합니다. – Alberto

1

당신의 1D의 경우 간단하게 할 수있는 첫 번째 주 :

foreach ($a2 as $k => $v) { 
    if (!isset($v)) { 
    $a2[$k] = $a1[$k]; 
    } 
} 

그런 다음 2D 경우에, 가정 1 레벨 키는 항상 동일 (또는 그것은 전혀 다른 문제가된다!) :

중첩의 깊이는 제한이 일반적인 경우에 대한
foreach ($superheroes_complete as $main_k => $main_v) { 
    foreach ($main_v as $k => $v) { 
    if (!isset($v)) { 
     $superheroes_empty[$main_k][$k] = $superheroes_complete[$main_k][$k]; 
    } 
    } 
0

, 당신이 사용할 수 이 재귀 함수 :

function fillEmpty(&$filled, &$empty) { // arguments are by reference 
    if ($empty === "") { 
     $empty = $filled; 
     return; 
    } 
    if (!is_array($filled) || !is_array($empty)) return; 
    foreach ($filled as $key => $value) { 
     if (isset($empty[$key])) fillEmpty($value, $empty[$key]); 
    } 
} 

예 호출 :

fillEmpty($superheroes_complete, $superheroes_empty); 

이 빈 값을 채우고, 두번째 인자를 수정한다.

PHP는 어떤 배열 값과 키를 비교하는 기능이 내장되어, 그것은 그것은 당신의 행운의 날이 될 수도 eval.in

0

에서 실행을 참조하십시오. 두 개 이상의 배열을 비교하여 차이를 반환 할 수있는 array_diff()을 사용하십시오. 그 반대 인 array_intersect()을 사용할 수도 있습니다.

키만 비교하려는 경우 키 차이 만 반환하는 array_diff_key() 또는 일치하는 키를 반환하는 array_intersect_key()을 사용하십시오.

+0

나는 단지'array_' 함수를 사용하는 해결책을보고 싶다. 그 코드가 없다면, 이것은 더 많은 코멘트입니다. – Pevara

0

재귀 솔루션을 고려해 볼 수도 있습니다. 이것은 1D 및 2D 배열 또는 N 차원 배열에서도 작동 할 수 있습니다.

재귀는 자원 집약적 일 수 있으므로주의해서 사용해야 함을 알고 있습니다. 그러나 이것은보다 다재다능한 솔루션이며보다 중첩 된 컨트롤 구조와 조기 반환을 통해 코드를보다 깨끗하게 유지합니다. 나는 PHP 루프가 더 잘 수행되어야한다고 가르침을 받았기 때문에 네이티브 array_walk 메서드를 사용할 것이다. 당신이 모두 당신의 예제에 작동하는지 볼 수 있도록 내가 조금 데모를 설정 한

function array_complement_recursive(&$partial, $complete) { 
    array_walk($partial, function(&$value, $key) use ($complete) { 
     // (for safety) complete does not contain matching key: done 
     if (! array_key_exists($key, $complete)) { 
      return; 
     } 

     // value is array: call recursive 
     if (is_array($value)) { 
      array_complement_recursive($value, $complete[$key]); 
      return; 
     } 

     // value is not 'empty': done 
     // note that null, 0, false will also not match, you may want to make 
     // this check more specific to match only the empty string 
     if ($value) { 
      return; 
     } 

     $value = $complete[$key]; 
    }); 
} 

:

그래서이처럼 내 코드가 보일 것이다 것입니다. 그리고 말했듯이, 더 많은 차원을 가진 배열이나 더 불규칙한 구조에서도 작동해야합니다.

http://phpfiddle.org/main/code/49iz-vrwg

내가 설명하지만, 아무것도 불분명 물어 주시기 몇 가지 의견을 추가했습니다.

관련 문제