Php get items from array

Php get items from array

// Before php 5.4
$array = array(1,2,3);

// since php 5.4 , short syntax
$array = [1,2,3];

// I recommend using the short syntax if you have php version >= 5.4

Used to creating arrays like this in Perl?

Looks like we need the range() function in PHP:

$array = array_merge (array( ‘All’ ), range ( ‘A’ , ‘Z’ ));
?>

You don’t need to array_merge if it’s just one range:

There is another kind of array (php>= 5.3.0) produced by

$array = new SplFixedArray(5);

Standard arrays, as documented here, are marvellously flexible and, due to the underlying hashtable, extremely fast for certain kinds of lookup operation.

Supposing a large string-keyed array

$arr=[‘string1’=>$data1, ‘string2’=>$data2 etc. ]

when getting the keyed data with

php does *not* have to search through the array comparing each key string to the given key (‘string1’) one by one, which could take a long time with a large array. Instead the hashtable means that php takes the given key string and computes from it the memory location of the keyed data, and then instantly retrieves the data. Marvellous! And so quick. And no need to know anything about hashtables as it’s all hidden away.

However, there is a lot of overhead in that. It uses lots of memory, as hashtables tend to (also nearly doubling on a 64bit server), and should be significantly slower for integer keyed arrays than old-fashioned (non-hashtable) integer-keyed arrays. For that see more on SplFixedArray :

Unlike a standard php (hashtabled) array, if you lookup by integer then the integer itself denotes the memory location of the data, no hashtable computation on the integer key needed. This is much quicker. It’s also quicker to build the array compared to the complex operations needed for hashtables. And it uses a lot less memory as there is no hashtable data structure. This is really an optimisation decision, but in some cases of large integer keyed arrays it may significantly reduce server memory and increase performance (including the avoiding of expensive memory deallocation of hashtable arrays at the exiting of the script).

When creating arrays , if we have an element with the same value as another element from the same array, we would expect PHP instead of creating new zval container to increase the refcount and point the duplicate symbol to the same zval. This is true except for value type integer.
Example:

$arr = [‘bebe’ => ‘Bob’, ‘age’ => 23, ‘too’ => 23 ];
xdebug_debug_zval( ‘arr’ );

(refcount=2, is_ref=0)
array (size=3)
‘bebe’ => (refcount=1, is_ref=0)string ‘Bob’ (length=3)
‘age’ => (refcount=0, is_ref=0)int 23
‘too’ => (refcount=0, is_ref=0)int 23

but :
$arr = [‘bebe’ => ‘Bob’, ‘age’ => 23, ‘too’ => ’23’ ];
xdebug_debug_zval( ‘arr’ );

(refcount=2, is_ref=0)
array (size=3)
‘bebe’ => (refcount=1, is_ref=0)string ‘Bob’ (length=3)
‘age’ => (refcount=0, is_ref=0)int 23
‘too’ => (refcount=1, is_ref=0)string ’23’ (length=2)
or :

$arr = [‘bebe’ => ‘Bob’, ‘age’ => [1,2], ‘too’ => [1,2] ];
xdebug_debug_zval( ‘arr’ );

(refcount=2, is_ref=0)
array (size=3)
‘bebe’ => (refcount=1, is_ref=0)string ‘Bob’ (length=3)
‘age’ => (refcount=2, is_ref=0)
array (size=2)
0 => (refcount=0, is_ref=0)int 1
1 => (refcount=0, is_ref=0)int 2
‘too’ => (refcount=2, is_ref=0)
array (size=2)
0 => (refcount=0, is_ref=0)int 1
1 => (refcount=0, is_ref=0)int 2

This function makes (assoc.) array creation much easier:

function arr (. $array )< return $array ; >
?>

It allows for short syntax like:

$arr = arr ( x : 1 , y : 2 , z : 3 );
?>

Instead of:

$arr = [ «x» => 1 , «y» => 2 , «z» => 3 ];
// or
$arr2 = array( «x» => 1 , «y» => 2 , «z» => 3 );
?>

Sadly PHP 8.2 doesn’t support this named arguments in the «array» function/language construct.

Источник

array_values

array_values() returns all the values from the array and indexes the array numerically.

Parameters

Return Values

Returns an indexed array of values.

Examples

Example #1 array_values() example

The above example will output:

See Also

  • array_keys() — Return all the keys or a subset of the keys of an array
  • array_combine() — Creates an array by using one array for keys and another for its values

User Contributed Notes 6 notes

Remember, array_values() will ignore your beautiful numeric indexes, it will renumber them according tho the ‘foreach’ ordering:

print_r ( array_values ( $a ));
==>
Array(
[ 0 ] => 11
[ 1 ] => 22
[ 2 ] => 33
[ 3 ] => 44
)
?>

Just a warning that re-indexing an array by array_values() may cause you to reach the memory limit unexpectly.

For example, if your PHP momory_limits is 8MB,
and says there’s a BIG array $bigArray which allocate 5MB of memory.

Doing this will cause PHP exceeds the momory limits:

$bigArray = array_values ( $bigArray );
?>

It’s because array_values() does not re-index $bigArray directly,
it just re-index it into another array, and assign to itself later.

This is another way to get value from a multidimensional array, but for versions of php >= 5.3.x
/**
* Get all values from specific key in a multidimensional array
*
* @param $key string
* @param $arr array
* @return null|string|array
*/
function array_value_recursive ( $key , array $arr ) $val = array();
array_walk_recursive ( $arr , function( $v , $k ) use( $key , & $val ) if( $k == $key ) array_push ( $val , $v );
>);
return count ( $val ) > 1 ? $val : array_pop ( $val );
>

$arr = array(
‘foo’ => ‘foo’ ,
‘bar’ => array(
‘baz’ => ‘baz’ ,
‘candy’ => ‘candy’ ,
‘vegetable’ => array(
‘carrot’ => ‘carrot’ ,
)
),
‘vegetable’ => array(
‘carrot’ => ‘carrot2’ ,
),
‘fruits’ => ‘fruits’ ,
);

var_dump ( array_value_recursive ( ‘carrot’ , $arr )); // array(2) < [0]=>string(6) «carrot» [1]=> string(7) «carrot2» >
var_dump ( array_value_recursive ( ‘apple’ , $arr )); // null
var_dump ( array_value_recursive ( ‘baz’ , $arr )); // string(3) «baz»
var_dump ( array_value_recursive ( ‘candy’ , $arr )); // string(5) «candy»
var_dump ( array_value_recursive ( ‘pear’ , $arr )); // null
?>

Most of the array_flatten functions don’t allow preservation of keys. Mine allows preserve, don’t preserve, and preserve only strings (default).

// recursively reduces deep arrays to single-dimensional arrays
// $preserve_keys: (0=>never, 1=>strings, 2=>always)
function array_flatten($array, $preserve_keys = 1, &$newArray = Array()) foreach ($array as $key => $child) if (is_array($child)) $newArray =& array_flatten($child, $preserve_keys, $newArray);
> elseif ($preserve_keys + is_string($key) > 1) $newArray[$key] = $child;
> else $newArray[] = $child;
>
>
return $newArray;
>

echo ‘var_dump($array);’.»\n»;
var_dump($array);
echo ‘var_dump(array_flatten($array, 0));’.»\n»;
var_dump(array_flatten($array, 0));
echo ‘var_dump(array_flatten($array, 1));’.»\n»;
var_dump(array_flatten($array, 1));
echo ‘var_dump(array_flatten($array, 2));’.»\n»;
var_dump(array_flatten($array, 2));
?>

If you are looking for a way to count the total number of times a specific value appears in array, use this function:

function array_value_count ( $match , $array )
<
$count = 0 ;

foreach ( $array as $key => $value )
<
if ( $value == $match )
<
$count ++;
>
>

return $count ;
>
?>

This should really be a native function of PHP.

/**
flatten an arbitrarily deep multidimensional array
into a list of its scalar values
(may be inefficient for large structures)
(will infinite recurse on self-referential structures)
(could be extended to handle objects)
*/
function array_values_recursive ( $ary )
$lst = array();
foreach( array_keys ( $ary ) as $k ) $v = $ary [ $k ];
if ( is_scalar ( $v )) $lst [] = $v ;
> elseif ( is_array ( $v )) $lst = array_merge ( $lst ,
array_values_recursive ( $v )
);
>
>
return $lst ;
>
?>

code till dawn! -mark meves!

Оцените статью