note 35194 modified in function.is-array by danbrown
| From: | danbrown@php.net | Date: | Sat, 27 Dec 2008 16:51:41 +0000 |
| Subject: | note 35194 modified in function.is-array by danbrown | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-148570@lists.php.net to get a copy of this message | ||
All arrays in PHP are associative arrays, but it is quite easy to treat an associative array just
like it is a sequential array. However, when dealing with XML-RPC, it is necessary to know whether
an array is associative or sequential, so I created this function.
It isn't perfect, since an associative array that just happens to have sequential, integer keys
starting with 0 will 'look' exactly like a sequential array, and will fool this function.
<?php
/****************************************************************
* is_assoc_array tries to decide whether or not a given array *
* is an associative array, or a sequential array. Of course, no *
* such distinction is made by PHP, so it really just tests *
* whether or not a given array could possibly be a sequential *
* array. Since an associative array with sequential, integer *
* keys 'looks' just like a sequential array, this function will *
* be fooled. *
* *
* BUG: Associative arrays with sequential, integer keys 'look' *
* just like sequential arrays, and will be identified as such. *
* *
****************************************************************/
function is_assoc_array( $php_val ) {
if( !is_array( $php_val ) ){
# Neither an associative, nor non-associative array.
return false;
}
$given_keys = array_keys( $php_val );
$non_assoc_keys = range( 0, count( $php_val ) );
if( function_exists( 'array_diff_assoc' ) ) { # PHP > 4.3.0
if( array_diff_assoc( $given_keys, $non_assoc_keys ) ){
return true;
}
else {
return false;
}
}
else {
if( array_diff( $given_keys, $non_assoc_keys ) and array_diff( $non_assoc_keys, $given_keys )
){
return true;
}
else {
return false;
}
}
}
?>
--was--
All arrays in PHP are associative arrays, but it is quite easy to treat an associative array just
like it is a sequential array. However, when dealing with XML-RPC, it is necessary to know whether
an array is associative or sequential, so I created this function.
It isn't perfect, since an associative array that just happens to have sequential, integer keys
starting with 0 will 'look' exactly like a sequential array, and will fool this function.
/****************************************************************
* is_assoc_array tries to decide whether or not a given array *
* is an associative array, or a sequential array. Of course, no *
* such distinction is made by PHP, so it really just tests *
* whether or not a given array could possibly be a sequential *
* array. Since an associative array with sequential, integer *
* keys 'looks' just like a sequential array, this function will *
* be fooled. *
* *
* BUG: Associative arrays with sequential, integer keys 'look' *
* just like sequential arrays, and will be identified as such. *
* *
****************************************************************/
function is_assoc_array( $php_val ) {
if( !is_array( $php_val ) ){
# Neither an associative, nor non-associative array.
return false;
}
$given_keys = array_keys( $php_val );
$non_assoc_keys = range( 0, count( $php_val ) );
if( function_exists( 'array_diff_assoc' ) ) { # PHP > 4.3.0
if( array_diff_assoc( $given_keys, $non_assoc_keys ) ){
return true;
}
else {
return false;
}
}
else {
if( array_diff( $given_keys, $non_assoc_keys ) and array_diff( $non_assoc_keys, $given_keys )
){
return true;
}
else {
return false;
}
}
}
http://php.net/manual/en/function.is-array.php