有一个函数从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手册中的以下条目:

http://php.net/manual/en/function.array-column.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); ?>