<?php

public function get_multi( $keys ) {
	$values = $fetch_keys = $key_map = array();
	foreach ( $keys as $group => $group_keys ) {
		foreach ( $group_keys as $group_key ) {
			$key = $this->key( $group_key, $group );

			if ( isset( $this->cache[ $key ] ) && in_array( $group, $this->no_mc_groups ) ) {
				if ( is_object( $this->cache[ $key ] ) ) {
					$values[ $group ][ $group_key ] = clone $this->cache[ $key ];
				} else {
					$values[ $group ][ $group_key ] = $this->cache[ $key ];
				}
			} elseif ( in_array( $group, $this->no_mc_groups ) ) {
				$this->cache[ $key ] = $values[ $group ][ $group_key ] = false;
			} else {
				$fetch_keys[] = $key;
				$key_map[ $key ] = array(
					'group' => $group,
					'group_key' => $group_key,
				);
			}
		}
	}

	$values = array();

	if ( $fetch_keys ) {
		$fetched = apc_fetch( $fetch_keys );

		foreach ( $fetch_keys as $fetch_key ) {
			$group     = $key_map[ $fetch_key ]['group'];
			$group_key = $key_map[ $fetch_key ]['group_key'];

			if ( isset( $fetched[ $fetch_key ] ) ) {
				$fetched_value = $fetched[ $fetch_key ];
				if ( is_object( $fetched_value ) && 'ArrayObject' == get_class( $fetched_value ) ) {
					$fetched_value = $fetched_value->getArrayCopy();
				}

				if ( null === $fetched_value ) {
					$fetched_value = false;
				}

				$this->cache[ $key ] = ( is_object( $fetched_value ) ) ? clone $fetched_value : $fetched_value;
				$values[ $group ][ $group_key ] = $this->cache[ $key ];

			} else {
				$this->cache[ $key ] = false;
				$values[ $group ][ $group_key ] = false;
			}
		}
	}

	@ ++$this->stats['get'];

	return $values;
}
