@@ -4300,11 +4300,22 @@ PHP_FUNCTION(array_column)
4300
4300
void * cache_slot_index [3 ] = { NULL , NULL , NULL };
4301
4301
4302
4302
array_init_size (return_value , zend_hash_num_elements (input )) ;
4303
- if (!group_is_null && group_bool && !index_is_null ) {
4304
-
4305
- zval * group_entry ;
4306
- zval fpal ;
4307
-
4303
+ /* Index param is not passed */
4304
+ if (index_is_null ) {
4305
+ zend_hash_real_init_packed (Z_ARRVAL_P (return_value ));
4306
+ ZEND_HASH_FILL_PACKED (Z_ARRVAL_P (return_value )) {
4307
+ ZEND_HASH_FOREACH_VAL (input , data ) {
4308
+ ZVAL_DEREF (data );
4309
+ if (column_is_null ) {
4310
+ Z_TRY_ADDREF_P (data );
4311
+ colval = data ;
4312
+ } else if ((colval = array_column_fetch_prop (data , column_str , column_long , cache_slot_column , & rv )) == NULL ) {
4313
+ continue ;
4314
+ }
4315
+ ZEND_HASH_FILL_ADD (colval );
4316
+ } ZEND_HASH_FOREACH_END ();
4317
+ } ZEND_HASH_FILL_END ();
4318
+ } else {
4308
4319
ZEND_HASH_FOREACH_VAL (input , data ) {
4309
4320
ZVAL_DEREF (data );
4310
4321
@@ -4317,72 +4328,81 @@ PHP_FUNCTION(array_column)
4317
4328
4318
4329
zval rv ;
4319
4330
zval * keyval = array_column_fetch_prop (data , index_str , index_long , cache_slot_index , & rv );
4320
-
4321
4331
if (keyval ) {
4332
+ array_set_zval_key (Z_ARRVAL_P (return_value ), keyval , colval );
4333
+ zval_ptr_dtor (colval );
4334
+ zval_ptr_dtor (keyval );
4335
+ } else {
4336
+ zend_hash_next_index_insert (Z_ARRVAL_P (return_value ), colval );
4337
+ }
4338
+ } ZEND_HASH_FOREACH_END ();
4339
+ }
4340
+ }
4341
+ /* }}} */
4322
4342
4323
- if (Z_TYPE_P (keyval ) == IS_LONG ) {
4324
- group_entry = zend_hash_index_find (Z_ARRVAL_P (return_value ), Z_LVAL_P (keyval ));
4325
- } else {
4326
- group_entry = zend_symtable_find (Z_ARRVAL_P (return_value ), Z_STR_P (keyval ));
4327
- }
4343
+ /* {{{ Return all the values from a single column in the input array, identified by the
4344
+ value_key and optionally indexed by the index_key in an indexed array */
4345
+ PHP_FUNCTION (array_column_group )
4346
+ {
4347
+ HashTable * input ;
4348
+ zval * colval , * data , rv ;
4349
+ zend_string * column_str = NULL ;
4350
+ zend_long column_long ;
4351
+ bool column_is_null = 0 ;
4352
+ zend_string * index_str = NULL ;
4353
+ zend_long index_long ;
4354
+ bool index_is_null = 1 ;
4328
4355
4329
- if (group_entry != NULL ) {
4330
- ZVAL_COPY_VALUE (& fpal , group_entry );
4331
- } else {
4332
- array_init (& fpal );
4333
- array_set_zval_key (Z_ARRVAL_P (return_value ), keyval , & fpal );
4334
- zval_ptr_dtor (& fpal );
4335
- }
4356
+ ZEND_PARSE_PARAMETERS_START (2 , 3 )
4357
+ Z_PARAM_ARRAY_HT (input )
4358
+ Z_PARAM_STR_OR_LONG_OR_NULL (column_str , column_long , column_is_null )
4359
+ Z_PARAM_OPTIONAL
4360
+ Z_PARAM_STR_OR_LONG_OR_NULL (index_str , index_long , index_is_null )
4361
+ ZEND_PARSE_PARAMETERS_END ();
4362
+
4363
+ void * cache_slot_column [3 ] = { NULL , NULL , NULL };
4364
+ void * cache_slot_index [3 ] = { NULL , NULL , NULL };
4336
4365
4337
- zend_hash_next_index_insert_new (Z_ARRVAL_P (& fpal ), colval );
4366
+ zval * group_entry ;
4367
+ zval fpal ;
4338
4368
4339
- zval_ptr_dtor (keyval );
4369
+ array_init_size (return_value , zend_hash_num_elements (input ));
4370
+ ZEND_HASH_FOREACH_VAL (input , data ) {
4371
+ ZVAL_DEREF (data );
4372
+
4373
+ if (column_is_null ) {
4374
+ Z_TRY_ADDREF_P (data );
4375
+ colval = data ;
4376
+ } else if ((colval = array_column_fetch_prop (data , column_str , column_long , cache_slot_column , & rv )) == NULL ) {
4377
+ continue ;
4378
+ }
4379
+
4380
+ zval rv ;
4381
+ zval * keyval = array_column_fetch_prop (data , index_str , index_long , cache_slot_index , & rv );
4382
+
4383
+ if (keyval ) {
4384
+
4385
+ if (Z_TYPE_P (keyval ) == IS_LONG ) {
4386
+ group_entry = zend_hash_index_find (Z_ARRVAL_P (return_value ), Z_LVAL_P (keyval ));
4340
4387
} else {
4341
- zend_hash_next_index_insert (Z_ARRVAL_P (return_value ), colval );
4388
+ group_entry = zend_symtable_find (Z_ARRVAL_P (return_value ), Z_STR_P ( keyval ) );
4342
4389
}
4343
4390
4391
+ if (group_entry != NULL ) {
4392
+ ZVAL_COPY_VALUE (& fpal , group_entry );
4393
+ } else {
4394
+ array_init (& fpal );
4395
+ array_set_zval_key (Z_ARRVAL_P (return_value ), keyval , & fpal );
4396
+ zval_ptr_dtor (& fpal );
4397
+ }
4344
4398
4345
- } ZEND_HASH_FOREACH_END ( );
4399
+ zend_hash_next_index_insert_new ( Z_ARRVAL_P ( & fpal ), colval );
4346
4400
4347
- } else {
4348
- /* Index param is not passed */
4349
- if (index_is_null ) {
4350
- zend_hash_real_init_packed (Z_ARRVAL_P (return_value ));
4351
- ZEND_HASH_FILL_PACKED (Z_ARRVAL_P (return_value )) {
4352
- ZEND_HASH_FOREACH_VAL (input , data ) {
4353
- ZVAL_DEREF (data );
4354
- if (column_is_null ) {
4355
- Z_TRY_ADDREF_P (data );
4356
- colval = data ;
4357
- } else if ((colval = array_column_fetch_prop (data , column_str , column_long , cache_slot_column , & rv )) == NULL ) {
4358
- continue ;
4359
- }
4360
- ZEND_HASH_FILL_ADD (colval );
4361
- } ZEND_HASH_FOREACH_END ();
4362
- } ZEND_HASH_FILL_END ();
4401
+ zval_ptr_dtor (keyval );
4363
4402
} else {
4364
- ZEND_HASH_FOREACH_VAL (input , data ) {
4365
- ZVAL_DEREF (data );
4366
-
4367
- if (column_is_null ) {
4368
- Z_TRY_ADDREF_P (data );
4369
- colval = data ;
4370
- } else if ((colval = array_column_fetch_prop (data , column_str , column_long , cache_slot_column , & rv )) == NULL ) {
4371
- continue ;
4372
- }
4373
-
4374
- zval rv ;
4375
- zval * keyval = array_column_fetch_prop (data , index_str , index_long , cache_slot_index , & rv );
4376
- if (keyval ) {
4377
- array_set_zval_key (Z_ARRVAL_P (return_value ), keyval , colval );
4378
- zval_ptr_dtor (colval );
4379
- zval_ptr_dtor (keyval );
4380
- } else {
4381
- zend_hash_next_index_insert (Z_ARRVAL_P (return_value ), colval );
4382
- }
4383
- } ZEND_HASH_FOREACH_END ();
4403
+ zend_hash_next_index_insert (Z_ARRVAL_P (return_value ), colval );
4384
4404
}
4385
- }
4405
+ } ZEND_HASH_FOREACH_END ();
4386
4406
}
4387
4407
/* }}} */
4388
4408
0 commit comments