2013-06-28 4 views
0

나는 IP 주소와 각각의 서브넷 정보를 포함하는 배열을 가지고 있습니다. 첫 번째 시간에, 나는 내 데이터베이스에 서브넷 정보를 추가해야하지만 첫 번째 foreach는 모든 서브넷을 추가하고 각 ID를 검색합니다다중 foreach에 PHP unset 배열

#Note that this is pseudo-code 
foreach ($subnets as $subnet) 
{ 
    $query = 'INSERT INTO subnets (field1, field2) 
       VALUES ($subnet['subnet'], $subnet['netmask']);' 

    $database->executeQuery($query); 

    $query = 'SELECT id FROM subnets 
       WHERE subnet = $subnet['subnet'] 
       AND mask = $subnet['netmask'];' 
    $subnet_id = $database->getRow($query); 

    foreach ($subnets as $key => $subnet_check) 
    { 
     if (($subnet['subnet'] == $subnet_check['subnet']) AND ($subnet['netmask'] == $subnet_check['netmask'])) 
     { 
      $ip_to_add = array_merge($ip_to_add,array(array("subnet_id" => $subnet_id[0], "ip" => $subnet['ip'], "name" => $subnet['name']))); 
      unset($subnets[$key]); 
     } 
    } 
} 

이 코드와 중복없이 그렇게 할 노력하고있어 . 두 번째 foreach는 모든 서브넷을 검색하여 복제본 (자체 포함)을 찾으려고합니다. 그렇다면 ip addresse 정보를 배열에 추가 한 다음이 요소를 설정 해제해야합니다. 서브넷을 다른 루프에 다시 삽입하고 싶지 않기 때문입니다.

그러나 결국에는 모든 서브넷과 IP 주소가 삽입되므로 모든 서브넷을 삽입하면 많은 중복이 발생하므로 올바르게 설정하지 않은 것 같습니다.

아무에게도 왜 설정이 제대로 작동하지 않는지 설명 할 수 있습니까? 내가 2 수준의 foreach에 속해 있기 때문인가?

감사합니다.

+5

이 순서를 뒤집어서 생각해 보셨습니까? 데이터베이스를 먼저 확인하고 일치하는 항목이없는 경우에만 새 레코드를 추가하십시오. 추가, 확인 및 제거하는 대신 – Dave

답변

1

PHP의 foreach() 문은 비밀리에 배열 복사본을 만들고 해당 복사본을 반복합니다. Copy-on-Write 의미 체계를 사용하기 때문에 성능에 영향을주지 않습니다. 따라서 배열은 foreach 루프 내부에서 쓰기 만하면 메모리에 실제로 복사됩니다. 너 여기서 뭘하고있는거야? 따라서 두 개의 루프는 실제로 $ 서브넷 배열의 두 가지 복사본을 반복합니다. 한 배열에서 설정을 해제하면 다른 배열에 영향을 미치지 않습니다.

가장 쉬운 방법은 PHP가 사본을 만들지 않도록 지시하는 것입니다. 모두 당신의 루프에서이 변경 :

foreach(array() as &$row) {} 

나, 여기 당신의 알고리즘이 개선 될 수 있다고 생각합니까 말했다

foreach(array() as $key => &$row) {} 

. 당신이하고있는 것처럼 는 그래서 것 같다 무엇 :

  1. 으로 반복 각 서브넷
  2. 삽입 삽입 된 행의 ID에 대한
  3. 쿼리
  4. 배열을 다시 반복하고 $에 항목을 추가 ip_to_add는 ID를 포함합니다.

내 질문은 $ ip_to_add에 마지막으로 표시되기를 원하십니까? 그것은, 바로 지금, 중복이 있다면 테이블에 하나의 삽입 만 있지만 $ ip_to_add에 중복 행이있는 것 같습니다. $ ip_to_add에 원래 $ 서브넷 배열과 동일한 수의 항목이있는 것 같습니다. 그게 네가 필요한거야?

하지 않으면, 내가 무엇을 할 것입니다 것은 :

  1. 드 - 속는 배열을
  2. 반복 처리는, ID를 얻을 수 mysql_insert_id()를 사용하여 삽입 및 배열에 그것을 추가합니다.