2013-12-12 2 views
1
나는 다음과 같이 $ _SESSION [ '입력'] 다차원 배열에서 고객의 주문 데이터를 유지

동일한 경우 값을 덮어 쓰기 :배열을 병합하고 키

$ _SESSION [ '입력'] [ '6'] [ 'S'] ===는 4 // 이는 고객에게 $ _POST [ '입력'(도 다차원 배열을 통해 제출 된 모든 새로운 입력이 S.

사이즈 ID 6 배속 제품을 지시 수단 동일한 형식), $ _POST [ 'input'] 데이터를 사용하여 $ _SESSION [ 'input'] 데이터를 추가 및/또는 덮어 쓰려고합니다.

문제가 :

  1. 제가 $ _SESSION [ '입력'] = array_merge 사용할 때 ($는 _ SESSION는 [ '입력'], $는 _ POST는 [ '입력'), 겹쳐 정확하지만 연관성 배열의 키가 숫자 키로 변경됩니다.
  2. $ _SESSION [ 'input'] = $ _SESSION [ 'input'] + $ _POST [ 'input']을 사용하면 모든 키가 올바르게 보존되지만 값은 등호로 덮어 쓰지 않습니다.

내가 찾은 모든 대답은 값을 덮어 쓰지 않거나 배열을 병합하지 않고 값을 덮어 쓰는 것입니다.

이 기능이 있습니까? 아니면 다른 생각?

+0

왜 ID를 배열에 문자열로 저장합니까? – zeflex

답변

0

나는 아이디어를 사용 Dave와 mArm.ch에 대해 알아보고 아주 간단한 해결책을 제시했습니다.

목표는 연관 $array1$array2을 병합하고 $array1$array2으로 덮어 쓰는 것입니다.

코드 : 거기에 중복이고 나는 간단하게 추가 할 수 있습니다 때

foreach (array_keys($array2) as $key) { 
    if (isset($array1[$key]) unset($array1[$key]); 
} 
$desired_array = $array1 + $array2; 

그래서 기본적으로 내가 하나 개의 배열에서 키를 삭제합니다.

두 배열 isset()is_array()이 모두 있는지 확인하십시오. 그렇지 않으면 치명적인 오류가 발생합니다.

1

for() 루프를 사용하면 어떨까요?

하나의 배열에 루프를 만들고 동일한 키가 다른 키에 있는지 확인한 후 현재 키에 해당하는 첫 번째 배열 값을 재정의합니다.

1

당신은

function arraysMergeUnique($array1, $array2) 
{ 
    foreach ($array2 as $k => $v) { 
     if (is_array($array1)) { 
      if (is_string($v) && ! in_array($v, $array1)) { 
       /** 
       * Preserve keys in n-dimension using $k 
       */ 
       $array1[$k] = $v; 
      } else if (is_array($v)) { 
       if (isset($array1[$k])) { 
        $array1[$k] = arraysMergeUnique($array1[$k], $v); 
       } else { 
        $array1[$k] = $v; 
       } 
      }     
     } else { 
      $array1 = array($v); 
     } 
    } 
    return $array1; 
} 

$one = array('input' => array(6 => array('s' => 'old'))); 
$two = array('input' => array(6 => array('s' => 'new'))); 
$three = arraysMergeUnique($one, $two); 

$ 세 다음이다 "깊은"키를 보존하기 위해 how to merge multidimensional arrays whilst preserving all unique key/values?에서 제공되는 기능의 라인을 따라 뭔가를 ... 수정할 수 :

Array 
(
    [input] => Array 
     (
      [6] => Array 
       (
        [s] => new 
       ) 

     ) 

)