是否有提取';列';从PHP中的数组?

是否有提取';列';从PHP中的数组?,php,arrays,Php,Arrays,我有一个数组,其结构如下: array(array('page' => 'page1', 'name' => 'pagename1') array('page' => 'page2', 'name' => 'pagename2') array('page' => 'page3', 'name' => 'pagename3')) 是否有一个内置函数可以返回一个只包含“name”键值的新数组?所以我会得到: array('pagename

我有一个数组,其结构如下:

array(array('page' => 'page1', 'name' => 'pagename1')
      array('page' => 'page2', 'name' => 'pagename2')
      array('page' => 'page3', 'name' => 'pagename3'))
是否有一个内置函数可以返回一个只包含“name”键值的新数组?所以我会得到:

array('pagename1', 'pagename2', 'pagename3')

为什么它必须是一个内置函数?没有,没有,你自己写吧

这是一个很好的和简单的一个,而不是其他在这个线程

$namearray = array();

foreach ($array as $item) {
    $namearray[] = $item['name'];
}
在某些情况下,如果密钥没有命名,您可以改为执行以下操作

$namearray = array();

foreach ($array as $key => $value) {
    $namearray [] = $value;
}

以下是一种实用的方法:

$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);

与fuentesjrs解决方案类似,但使用带有自定义回调的数组_walk()更为通用:

// 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, e.g. 'page'
array_walk($copy, 'extract_named_sub_elements', 'name');

print_r($copy);
您可以扩展并重写方法
混合电流(void)

印刷品

page1

page2
page3

我不认为有任何需要有一个内置的功能。 您的这些数组中可能有一个数组

$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是您想要的输出,然后是$output2

如果需要该数组中的所有值并对该数组进行数字索引,则可以使用

$array_1=array_values($samples); 

但据我所知,您不想要这个。

PHP5.5
开始,您可以使用:



这应该适用于php版本<5.5,并在函数存在的情况下降级。至少对于PHP>5.5.0,它被称为

PHP函数采用可选的
$index_key
参数,根据PHP网站,该参数表示:

$index\u键

用作返回数组的索引/键的列。此值 可以是列的整数键,也可以是字符串键名

在这里的答案中,我看到了一个没有可选参数的精简版本。 我需要它,下面是完整的函数:

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;
    }
}

是的,有一个php内置函数,名为array_column,它完成了您所需要的功能

您可以将其称为类似于
$name\u keys=array\u column($array,'name')
以获取您要查找的结果

有关更多详细信息,请参阅PHP手册中的以下条目:

使用数组\u reduce:

$names = array_reduce($array, function ($carry, $item) {
    return array_merge($carry, [$item['name']]);
}, []);

为了扩展这里的一些答案,从PHP5.5开始,array_列就是您想要的

它实际上有一些可能的用途

使用下面的示例数组,以下是使用数组_列的不同方法

$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');
$d[1] = 'Joe';
$d[2] = 'Jane';
请注意,我选择作为第三个参数的列如何成为每个项的键,并且我通过将第二个参数设置为null来获得完整数组

当然,最后的用法是设置第2个和第3个参数

$d = array_column($a, 'name', 'id');
我会给你以下信息

$c[1] = array('id' => '1', 'name' => 'Joe');
$c[2] = array('id' => '2', 'name' => 'Jane');
$d[1] = 'Joe';
$d[2] = 'Jane';

我个人使用完整的3个参数来创建选择选项列表。如果我有一个带有选项的表,我查询该表,得到结果并将其传递到该表中,以得到一个以键作为值和标签的列表。这是一种很好的方法,用于构建需要通过索引相交的信息集。

我想在这里发布,即使这是一个老问题,因为它仍然非常相关,许多开发人员不使用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
(
    [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\u column(…)


以下是您需要了解的所有内容:

不是“内置”,但短箭头函数有助于简化显式编码(在Php v7.4中引入),并且可以与数组映射一起用于数组转换

这里,对从每个子数组返回所需属性的数组的每个成员应用回调:

<?php
$data =
[
    ['page' => 'page1', 'name' => 'pagename1'],
    ['page' => 'page2', 'name' => 'pagename2'],
    ['page' => 'page3', 'name' => 'pagename3']
];

$names = array_map(fn($v) => $v['name'], $data);
var_export($names);
OP在
array\u列
existed(来自PHP5.5.0)之前发布了这个问题。这用一个简短的解决方案回答了原始问题:

$names = array_column($data, 'name');
但简单的循环也是陈腐的:

foreach($data as $item) $names[] = $item['name'];

好的,考虑到你最近的编辑(“简单一点,与其他人不同”),我会咬;)如果您按照原始请求将代码转换为实际函数,它将与下面的
array\u map()
array\u walk()
示例一样“复杂”,特别是如果您想添加一个执行示例的话。是的,我认为我的示例是给定PHP功能的最优雅的示例,也是第一个完整的示例。:)嗨,谢谢。在我的问题中,我实际上问的是是否有一个内置的功能——我不喜欢重新发明轮子。您给了我一个答案,您的解决方案基本上就是我所写的。如果其中一个数组没有
名称
条目,将发出通知或警告。下面约翰·康德的回答是:“有内置函数吗?”的正确答案。我喜欢这个,其中的lambda非常适合我的大脑,因为我一直在学习这个计划+很好,谢谢约翰。我一直在研究PHP5.5,但我还没有看到这一点。这应该是正确的答案,因为PHP已经添加了内置函数,这正是OP所要求的。@John Conde,今天一定有人为你准备了它,因为你的许多帖子都被标记为低质量…@选项谢谢提醒。如果他们在做这样的事,我认为不会有任何结果。但是他们在浪费人们的时间,这真是太可惜了。@John,没问题,我不确定你是否可以把这个标记给工作人员,让他们对此进行预防。。尽管如此,我还是像其他人一样做好了标记:)这个答案只有在PHP版本大于5时才有效。确切地说,大于5.5。array_reduce做什么?请解释它,而不是只是粘贴一些没有解释的代码。Cheers@Martin我同意