请记住,array_values() 将忽略您漂亮的数字索引,它会根据“foreach”的排序重新编号它们。
<?php
$a = array(
3 => 11,
1 => 22,
2 => 33,
);
$a[0] = 44;
print_r( array_values( $a ));
==>
Array(
[0] => 11
[1] => 22
[2] => 33
[3] => 44
)
?>
(PHP 4, PHP 5, PHP 7, PHP 8)
array_values — 返回数组中的所有值
array
数组。
返回一个包含值的索引数组。
示例 #1 array_values() 示例
<?php
$array = array("size" => "XL", "color" => "gold");
print_r(array_values($array));
?>
上面的示例将输出
Array ( [0] => XL [1] => gold )
请记住,array_values() 将忽略您漂亮的数字索引,它会根据“foreach”的排序重新编号它们。
<?php
$a = array(
3 => 11,
1 => 22,
2 => 33,
);
$a[0] = 44;
print_r( array_values( $a ));
==>
Array(
[0] => 11
[1] => 22
[2] => 33
[3] => 44
)
?>
只需提醒一下,通过 array_values() 重新索引数组可能会导致您意外地达到内存限制。
例如,如果您的 PHP momory_limits 为 8MB,
并且说有一个名为 $bigArray 的大型数组,它分配了 5MB 的内存。
执行以下操作会导致 PHP 超出内存限制
<?php
$bigArray = array_values( $bigArray );
?>
这是因为 array_values() 不会直接重新索引 $bigArray,
它只是将其重新索引到另一个数组中,然后稍后将其分配给自己。
这是从多维数组中获取值的另一种方法,但适用于 php >= 5.3.x 的版本
<?php
/**
* 从多维数组中获取特定键的所有值
*
* @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
?>
大多数 array_flatten 函数不允许保留键。我的函数允许保留、不保留,以及仅保留字符串(默认值)。
<?
// 递归地将深层数组缩减为一维数组
// $preserve_keys: (0=>从不,1=>字符串,2=>总是)
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;
}
// 测试
$array = Array(
'A' => Array(
1 => 'foo',
2 => Array(
'a' => 'bar'
)
),
'B' => 'baz'
);
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));
?>
如果您正在寻找一种方法来计算特定值在数组中出现的总次数,请使用以下函数
<?php
function array_value_count ($match, $array)
{
$count = 0;
foreach ($array as $key => $value)
{
if ($value == $match)
{
$count++;
}
}
return $count;
}
?>
这应该成为 PHP 的一个原生函数。
<?php
/**
将任意深度的多维数组扁平化为其标量值的列表
(对于大型结构可能效率低下)
(将在自引用结构上无限递归)
(可以扩展以处理对象)
*/
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;
}
?>
代码直到破晓! - 马克·梅夫斯!