是否有提取';列';从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我同意