Browse Source

[php] key=>value iterators for native arrays

Alexander Kuzmenko 7 years ago
parent
commit
18e3a5d480
3 changed files with 70 additions and 0 deletions
  1. 24 0
      std/php/NativeArray.hx
  2. 24 0
      std/php/NativeAssocArray.hx
  3. 22 0
      std/php/NativeIndexedArray.hx

+ 24 - 0
std/php/NativeArray.hx

@@ -41,4 +41,28 @@ using php.Global;
 
 	public inline function iterator()
 		return (this:NativeIndexedArray<Dynamic>).iterator();
+
+	public inline function keyValueIterator():NativeArrayKeyValueIterator
+		return new NativeArrayKeyValueIterator(this);
+}
+
+private class NativeArrayKeyValueIterator {
+	var length:Int;
+	var current:Int = 0;
+	var keys:NativeIndexedArray<EitherType<String,Int>>;
+	var values:NativeIndexedArray<Dynamic>;
+
+	public inline function new(data:NativeArray) {
+		length = Global.count(data);
+		this.keys = Global.array_keys(data);
+		this.data = Global.array_values(data);
+	}
+
+	public inline function hasNext():Bool {
+		return current < length;
+	}
+
+	public inline function next():{key:EitherType<String,Int>, value:Dynamic} {
+		return {key:keys[current], value:data[current++]};
+	}
 }

+ 24 - 0
std/php/NativeAssocArray.hx

@@ -37,4 +37,28 @@ abstract NativeAssocArray<T>(NativeArray) from NativeArray to NativeArray {
 
 	public inline function iterator()
 		return (cast Global.array_values(this):NativeIndexedArray<T>).iterator();
+
+	public inline function keyValueIterator():NativeAssocArrayKeyValueIterator<T>
+		return new NativeAssocArrayKeyValueIterator(this);
 }
+
+private class NativeAssocArrayKeyValueIterator<T> {
+	var length:Int;
+	var current:Int = 0;
+	var keys:NativeIndexedArray<T>;
+	var values:NativeIndexedArray<T>;
+
+	public inline function new(data:NativeIndexedArray<T>) {
+		length = Global.count(data);
+		this.keys = Global.array_keys(data);
+		this.data = Global.array_values(data);
+	}
+
+	public inline function hasNext():Bool {
+		return current < length;
+	}
+
+	public inline function next():{key:String, value:T} {
+		return {key:keys[current], value:data[current++]};
+	}
+}

+ 22 - 0
std/php/NativeIndexedArray.hx

@@ -41,6 +41,9 @@ abstract NativeIndexedArray<T>(NativeArray) from NativeArray to NativeArray {
 	public inline function iterator():NativeIndexedArrayIterator<T>
 		return new NativeIndexedArrayIterator(this);
 
+	public inline function keyValueIterator():NativeIndexedArrayKeyValueIterator<T>
+		return new NativeIndexedArrayKeyValueIterator(this);
+
 	@:to
 	inline function toHaxeArray():Array<T>
 		return @:privateAccess Array.wrap(this);
@@ -67,4 +70,23 @@ private class NativeIndexedArrayIterator<T> {
 	public inline function next():T {
 		return data[current++];
 	}
+}
+
+private class NativeIndexedArrayKeyValueIterator<T> {
+	var length:Int;
+	var current:Int = 0;
+	var data:NativeIndexedArray<T>;
+
+	public inline function new(data:NativeIndexedArray<T>) {
+		length = Global.count(data);
+		this.data = data;
+	}
+
+	public inline function hasNext():Bool {
+		return current < length;
+	}
+
+	public inline function next():{key:Int, value:T} {
+		return {key:current, value:data[current++]};
+	}
 }