有一个函数从PHP中的数组中提取“列”?
我有一个数组的数组,具有以下结构:
array(array('page' => 'page1', 'name' => 'pagename1') array('page' => 'page2', 'name' => 'pagename2') array('page' => 'page3', 'name' => 'pagename3'))
有没有一个内置的函数,将返回一个新的数组只有'名称'键的值? 所以我会得到:
array('pagename1', 'pagename2', 'pagename3')
为什么它必须是内置函数? 不,没有,写你自己的。
这是一个很好的,容易的,而不是在这个线程中的其他人。
$namearray = array(); foreach ($array as $item) { $namearray[] = $item['name']; }
从PHP 5.5
你可以使用array_column()
:
<?php $samples=array( array('page' => 'page1', 'name' => 'pagename1'), array('page' => 'page2', 'name' => 'pagename2'), array('page' => 'page3', 'name' => 'pagename3') ); $names = array_column($samples, 'name'); print_r($names);
看到它的行动
这是一个function性的方法:
$data = array( array('page' => 'page1', 'name' => 'pagename1'), array('page' => 'page2', 'name' => 'pagename2'), array('page' => 'page3', 'name' => 'pagename3')); $result = array_map(create_function('$arr', 'return $arr["name"];'), $data); print_r($result);
那么有。 至less对于PHP> 5.5.0而言,它被称为array_column
PHP函数带有一个可选的$index_key
参数,根据PHP网站的$index_key
:
$index_key
用作返回数组的索引/键的列。 该值可能是列的整数键,也可能是string键名
在这里的答案,我看到一个没有可选参数的剥离版本。 我需要它,所以,这是完整的function:
if (!function_exists('array_column')) { function array_column($array, $column, $index_key = null) { $toret = array(); foreach ($array as $key => $value) { if ($index_key === null){ $toret[] = $value[$column]; }else{ $toret[$value[$index_key]] = $value[$column]; } } return $toret; } }
类似fuentesjrs的解决scheme,但更具普遍性使用array_walk()与自定义callback:
// Define the callback function extract_named_sub_elements(&$item, $key, $name) { $item = $item[$name]; } // Test data $original = array( array('page' => 'page1', 'name' => 'pagename1'), array('page' => 'page2', 'name' => 'pagename2'), array('page' => 'page3', 'name' => 'pagename3'), ); // Use a copy, as array_walk() operates directly on the passed in array $copy = $original; // Substitute 'name' with whatever element you want to extract, eg 'page' array_walk($copy, 'extract_named_sub_elements', 'name'); print_r($copy);
if (!function_exists('array_column')) { function array_column($array,$column) { $col = array(); foreach ($array as $k => $v) { $col[]=$v[$column]; } return $col; } }
这应该适用于PHP版本<5.5,并在function存在的情况下降级
是的,有一个名为array_column的php内置函数可以完成你正在寻找的任务。
你可以把它叫做$name_keys = array_column($array, 'name');
得到你正在寻找的结果。
有关更多详细信息,请参阅PHP手册中的以下条目:
您可以扩展ArrayIterator类并覆盖mixed current(void)
。
class Foo extends ArrayIterator { protected $index; public function __construct($array, $index) { parent::__construct($array); $this->index = $index; } public function current() { $c = parent::current(); return isset($c[$this->index]) ? $c[$this->index] : null; } } $a = array( array('page' => 'page1', 'name' => 'pagename1'), array('name' => '---'), array('page' => 'page2', 'name' => 'pagename2'), array('page' => 'page3', 'name' => 'pagename3') ); $f = new Foo($a, 'page'); foreach($f as $e) { echo $e, "\n"; }
版画
page1 page2 page3
我不认为有必要有一个内置的function。 这些数组中可能有一个数组。
$samples=array( array('page' => 'page1', 'name' => 'pagename1'), array('page' => 'page2', 'name' => 'pagename2'), array('page' => 'page3', 'name' => 'pagename3') ); $output1=array(); $output2=array(); foreach($samples as $sample){ array_push($output1,$sample['name']); $output2[]=array_splice($sample,1); } print_r($output1); print_r($output2);
在$ output1中,如果只想删除'page'索引'部分,然后输出$ output2,则输出结果。
如果您需要该数组中的所有值并以数值的forms索引数组,则可以使用
$array_1=array_values($samples);
但是我明白,你不想要这个。
您需要为5.5.0以上的PHP
版本创build自己的。
对于PHP
5.5.0及更高版本,有array_column
函数。
你可以在这里find更多的例子 。
这对array_reduce非常简单。
$valuesOnly = array_reduce($modelData, function ($carry, $item) { return array_merge($carry, $item['id']); }, []);
我想在这里发布,即使这是一个老问题,因为它仍然是非常相关的,许多开发人员不使用PHP> = 5.5
假设你有一个这样的数组:
Array ( [files] => Array ( [name] => Array ( [0] => file 1 [1] => file 2 [2] => file 3 ) [size] => Array ( [0] => 1 [1] => 2 [2] => 3 ) [error] => Array ( [0] => abc [1] => def [2] => ghi ) ) )
和你想要的输出是这样的:
Array ( [0] => Array ( [0] => file 1 [1] => 1 [2] => abc ) [1] => Array ( [0] => file 2 [1] => 2 [2] => def ) [2] => Array ( [0] => file 3 [1] => 3 [2] => ghi ) )
您可以简单地使用array_map()方法,而不用传递函数名作为第一个参数,如下所示:
array_map(null, $a['files']['name'], $a['files']['size'], $a['files']['error']);
不幸的是,如果传递多个数组,则不能映射密钥。
你的意思是array_values ?
编辑:感谢评论lessdownvote。 如果谁花时间去查看这个函数的文档,你会看到第一个注释给出了编写你自己的array_values_recursive函数的例子。 结合array_walk,你会有一个非常漂亮的function,不会有“名称”列硬编码到它。 啧。
为了扩展这里的一些答案,从PHP 5.5开始,array_column就是你想要的。
它实际上有一些可能的用途。
使用下面的示例数组,下面是使用array_column的不同方法。
$a = array( array('id' => '1', 'name' => 'Joe'), array('id' => '2', 'name' => 'Jane') );
作为数组检索单个列
$b = array_column($a, 'name');
会给你。 注意从0开始的自动键,按照普通数组。
$b[0] = 'Joe'; $b[1] = 'Jane';
以列作为索引检索完整数组。
$c = array_column($a, NULL, 'id');
会导致以下。
$c[1] = array('id' => '1', 'name' => 'Joe'); $c[2] = array('id' => '2', 'name' => 'Jane');
注意我作为第三个参数select的列成为每个项目的关键,我通过将第二个参数设置为null来获得完整的数组。
当然,最后的用法是设置第二和第三参数。
$d = array_column($a, 'name', 'id');
会给你以下。
$d[1] = 'Joe'; $d[2] = 'Jane';
我个人使用完整的3个参数来创buildselect列表。 如果我有一个与我的选项表,我查询表,并获得结果,并将其传递到这个获得一个列表与键和值作为标签。 这是构build需要与索引相交的信息集的一个很好的方法。
尝试这个
<?php $array=array(array('page' => 'page1', 'name' => 'pagename1'), array('page' => 'page2', 'name' => 'pagename2'), array('page' => 'page3', 'name' => 'pagename3')); $name = array_column($array, 'name'); print_r($name); ?>