|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2004-09-16 14:44 UTC] kevin at stormtide dot ca
Description:
------------
IN SPL: The ArrayAccess interface does not correcly work with the root level count() function. I realise that the ArrayObject interface supposedly does, however that class requires an array as the basis, and thus is not useful for virtual arrays (like abstracting a large db without ever loading it)
Reproduce code:
---------------
class somearray implements ArrayAccess {
... overloads and such.
function length() {
return count($this->internalarrayorabstract);
}
}
$inst = new somearray();
$inst[0] = 'foo';
$inst[1] = 'foo';
$inst[2] = 'foo';
$length = $isnt->length;
$countedlength = count($inst);
//$length and $countedlength will differ in value with the latter returning 1 always and the former the correct val.
Expected result:
----------------
$countedlength == $length
Actual result:
--------------
$countedlength == 1
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Tue Nov 04 19:00:02 2025 UTC |
Sorry for the mockup code. I thought it would be sufficient to describe the problem. Here is actually executable code. <?PHP error_reporting(E_ALL); class NArray Implements ArrayAccess, Iterator { private $arraylist; private $currentIndex; function __construct() { $this->currentIndex = 0; $this->arraylist = array(); } function offsetExists($offset){ if(isset($this->arraylist[$offset])){ return TRUE; } else { return FALSE; } } function offsetGet($offset){ return $this->arraylist[$offset]; } function offsetSet($offset, $value){ if($offset){ $this->arraylist[$offset] = $value; } else { $this->arraylist[] = $value; } } function offsetUnset($offset){ unset($this->arraylist[$offset]); } function current() { return $this->arraylist[$this->currentIndex]; } function key() { return $this->currentIndex; } function next() { return $this->arraylist[$this->currentIndex++]; } function rewind() { $this->currentIndex = 0; } function valid() { if(array_key_exists($this->currentIndex, $this->arraylist)) { return true; } else { return false; } } function append($value) { $this->arraylist->offsetSet(null, $value); } function length() { return count($this->arraylist); } function getIterator() { return $this; } } $nArray = new NArray(); $nArray[0] = 'a'; $nArray[1] = 'b'; $nArray[2] = 'c'; $nArray[3] = 'd'; foreach($nArray as $index => $item) { echo $index . ' = '. $item . '<br />'; } echo 'Counted Length Outside Class: '. count($nArray) ."<br>"; echo 'Counted Length Inside Class: '.$nArray->length(); echo "<br><br><br>"; show_source(__FILE__); ?> Please ignore the fact that this should be an arrayobject because it is simply a proof of concept, the use of an arrayaccess interface will be used later to work with a sql dataset without actually loading all the data in that dataset. A count value will be returned from num_rows type commands without an internal array of the data ever existing. Hope this helps.Probably PHP 5.1 comes with the following interface which works with count(): Interface Countable { function count() }