Skip to content

Commit ba65d23

Browse files
feat(types): expose IsPacked to help dealing with hashmaps and lists in Go code
1 parent 724c0b1 commit ba65d23

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

docs/extensions.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ func process_data_packed(arr *C.zval) unsafe.Pointer {
211211
- `frankenphp.GoAssociativeArray(arr unsafe.Pointer, ordered bool) frankenphp.AssociativeArray` - Convert a PHP array to an ordered Go `AssociativeArray` (map with order)
212212
- `frankenphp.GoMap(arr unsafe.Pointer) map[string]any` - Convert a PHP array to an unordered Go map
213213
- `frankenphp.GoPackedArray(arr unsafe.Pointer) []any` - Convert a PHP array to a Go slice
214+
- `frankenphp.IsPacked(ht *C.HashTable) bool` - Check if a PHP array is packed (indexed only) or associative (key-value pairs)
214215

215216
### Declaring a Native PHP Class
216217

types.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,26 @@ func createNewArray(size uint32) *C.HashTable {
401401
return (*C.HashTable)(unsafe.Pointer(arr))
402402
}
403403

404+
// IsPacked determines if the given zval pointer represents a packed array (list).
405+
// Returns false if the zval is nil, not an array, or not packed.
406+
func IsPacked(zval unsafe.Pointer) bool {
407+
if zval == nil {
408+
return false
409+
}
410+
411+
v, err := extractZvalValue((*C.zval)(zval), C.IS_ARRAY)
412+
if err != nil {
413+
return false
414+
}
415+
416+
ht := (*C.HashTable)(v)
417+
if ht == nil {
418+
return false
419+
}
420+
421+
return htIsPacked(ht)
422+
}
423+
404424
// htIsPacked checks if a HashTable is a list (packed) or hashmap (not packed).
405425
func htIsPacked(ht *C.HashTable) bool {
406426
flags := *(*C.uint32_t)(unsafe.Pointer(&ht.u[0]))

0 commit comments

Comments
 (0)