2014-01-15 6 views
0

난 배열 I는 해당 idlistener에 maxMsgId 바꿔야이푸시 배열로 항목을 대체 PHP

$privateMsgIdArray = array("idlistener" => $idlistener, "maxMsgId" => $lastMsgId); 

같이해야하고, 만약가 존재하지 않는 통과 idlistener 배열 내부에 새 항목을 만듭니다.

저는 idlistener에 해당하는 maxMsgId 값을 추출하는 방법에 대해 혼란 스럽습니다.

다른 말로하면, idListeners의 새로운 값을 한 번만 전달하고, maxMsgId를 해당하는 idlistener와 같지 않을 때마다 바꿔야합니다. idlistener 필드가 존재하지 않으면 생성하십시오 (배열로 푸시).

이전 배열을 세션과 현재 배열의 새 배열로 전달합니다. 실행 후 나는 그들을 대체합니다.

나는 이것이 약간 혼란 스럽다고 생각합니다. [15] [200]

다음 통화 maxMsgId은210 배열이 [15] [210]

다음 호출 우리가 가지고 :

예를 들어 우리는 이미 같은 배열을 maxMsgId 30 어레이와 새로운 청취자 이드되어야 [15] [210] [16] [30]

답변

0

짧은 루프이를 달성 할 수 있어야한다 :,745

효율이 후있어 무엇인가, "캐시"스타일 idlistener 값의 방법과 $privateMsgIdArray 배열에서의 인덱스를 생성하는 것이 현명 할 경우
// your "new" values 
$idListener = 15; 
$maxMsgId = 210; 

// loop over the array to see if it contains the `idlistener` you want 
$end = count($privateMsgIdArray); 
for ($i = 0; $i < $end; $i++) { 
    if ($privateMsgIdArray[$i]['idlistener'] == $idListener) { 
     // we found it! overwrite the `maxMsgId` field 
     $privateMsgIdArray[$i]['maxMsgId'] = $maxMsgId; 
     break; 
    } 
} 
if ($i == $end) { 
    // we reached the end of the array without finding the `$idListener`; 
    // add a new entry =] 
    $privateMsgIdArray[] = array(
     'idlistener' => $idListener, 
     'maxMsgId' => $maxMsgId 
    ); 
} 

이것은, 비록 오히려 무차별 접근 방식입니다. 예를 들어

: 위의 접근 방식

// key = idlistener, value = index in `$privateMsgIdArray` 
$idCache = array(15 => 0, 16 => 1); 

// check if the `$idListener` is in the cache 
if (!isset($idCache[$idListener])) { 
    // it's not; add a new entry 
    $key = count($privateMsgIdArray); 
    $privateMsgIdArray[$key] = array(
     'idlistener' => $idListener, 
     'maxMsgId' => $maxMsgId 
    ); 
    // add the new index into the cache 
    $idCache[$idListener] = $key; 
} else { 
    // it is in the cache; pull the corresponding index and set the `maxMsgId` =] 
    $privateMsgIdArray[$idCache[$idListener]]['maxMsgId'] = $maxMsgId; 
} 

너무 "휴대 성"일을하는 함수로 변환 할 수 있습니다.

+0

나는이 작품을 고맙다고 생각한다 : D, 여전히 나는 이전 maxMsgId와 새로운 것 사이의 차이를 어떻게 계산하는지 혼란 스럽다. 예 : 캐시 된 ID 및 교정 ID. 그 이후로 얼마나 많은 메시지가 전달되는지 확인합니다. – user3127632

+0

@ user3127632 위의 방법 중 하나를 사용하는 경우 값이 배열에 "where"를 찾으면 수학을 수행 할 수 있습니다. 예를 들어, 첫 번째 예에서, (값을 덮어 쓰기 전에)'if' 문 안에서 이것을 사용할 수 있습니다 :'$ maxIdDifference = $ maxMsgId - $ privateMsgIdArray [$ i] [ 'maxMsgId'];'. – newfurniturey

+0

나는 바보 같은 소리를하지만 나는 이것을 게시하기 전에 이것을 해보기 위해 혼란 스럽다. 나는이 루프를 사용한 후 두 번째 방법을 사용한다.이 $ _SESSION [ 'privateMessages'] = $ privateMsgIdArray; 하지만이 "캐시 된 데이터"를 사용할 때 아무 것도 표시되지 않습니다. $ _ SESSION [ 'privateMessages'] [$ idlistener] [ 'maxMsgId']; 이것은 새로운 데이터를 표시합니다 : echo "newdata". $ currentCount = $ privateMsgArray [$ _ SESSION [ 'privateMessages'] [$ idlistener]] [ 'maxMsgId']; 세션 캐시 된 데이터와 위에서 설명한 것처럼 새로운 작업을 수행하려고합니다. – user3127632