/** * Removes messages from the ID mapping. * * @param Horde_Imap_Client_Ids $ids IDs to remove. */ public function remove(Horde_Imap_Client_Ids $ids) { /* For sequence numbers, we need to reindex anytime we have an index * that appears equal to or after a previously seen index. If an IMAP * server is smart, it will expunge in reverse order instead. */ if ($ids->sequence) { $remove = $ids->ids; } else { $ids->sort(); $remove = array_reverse(array_keys($this->lookup($ids))); } if (empty($remove)) { return; } $this->sort(); /* Find the minimum sequence number to remove. We know entries before * this are untouched so no need to process them multiple times. */ $first = min($remove); $edit = $newids = array(); foreach (array_keys($this->_ids) as $i => $seq) { if ($seq >= $first) { $i += $seq == $first ? 0 : 1; $newids = array_slice($this->_ids, 0, $i, true); $edit = array_slice($this->_ids, $i + ($seq == $first ? 0 : 1), null, true); break; } } if (!empty($edit)) { foreach ($remove as $val) { $found = false; $tmp = array(); foreach (array_keys($edit) as $i => $seq) { if ($found) { $tmp[$seq - 1] = $edit[$seq]; } elseif ($seq >= $val) { $tmp = array_slice($edit, 0, $seq == $val ? $i : $i + 1, true); $found = true; } } $edit = $tmp; } } $this->_ids = $newids + $edit; }