2009-09-29 52 views
14

我有数组的数组,结构如下:有没有从PHP中的数组中提取'列'的函数?

array(array('page' => 'page1', 'name' => 'pagename1') 
     array('page' => 'page2', 'name' => 'pagename2') 
     array('page' => 'page3', 'name' => 'pagename3')) 

有一个内置函数,它会返回一个新的数组与“名称”键只值是多少?所以我会得到:

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

24小时?过早。等待48小时。这对于让一些答案获得更多选票并将其打开以获得更多相关答案是很好的。 – random 2009-09-30 09:27:57

+0

我的意思不是听起来像一个混蛋,但这不是一个复杂的问题,几天之后就会发现一个惊人的解决方案。 – fuentesjr 2009-09-30 18:55:40

回答

17

为什么它必须是内置函数?不,没有,写你自己的。

这是一个不错的和容易的,而不是在这个线程中的其他人。

$namearray = array(); 

foreach ($array as $item) { 
    $namearray[] = $item['name']; 
} 
+1

好吧,考虑到你最近的编辑('简单的,作为)我会咬;) 如果你根据原始请求将你的代码变成一个真正的函数,它将和'array_map()'或'array_walk()'示例一样'复杂'下面,特别是如果你想添加一个执行的例子。 – 2009-09-29 23:12:09

+0

是的,我认为我的PHP是最优雅的功能和第一个完整的例子。 :) – fuentesjr 2009-09-30 06:19:19

+1

嗨,谢谢。我在问题中实际问到的是如果有内置功能 - 我不喜欢重新发明轮子。你给了我一个答案,你的解决方案基本上是我写的。 – Skilldrick 2009-09-30 21:49:57

-1

你的意思是array_values

编辑:谢谢你的评论downvote。如果谁花时间真正查看函数的文档,您会看到第一个注释,它提供了编写自己的array_values_recursive函数的示例。把它和array_walk结合起来,你会得到一个非常漂亮的函数,它不会将'name'列写入硬编码。啧。

+0

我再次投票赞成你,但是现在真的有这种竞争来想出最复杂的解决方案吗? :) – 2009-09-29 21:28:55

+0

谢谢。 :)希望这不是一个竞争,只是有点恼火,这种情况发生了很多,当我尝试在一个方向上转向人,而不是为他们写出解决方案。 – 2009-09-29 21:37:18

12

下面是做这件事的一个功能性的方式:

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

我喜欢这一点,并在它的拉姆达与我的大脑在此刻非常适合,因为我一直在学习计划。 +1 – Skilldrick 2009-09-30 21:48:49

1

类似fuentesjrs的解决方案,但有点更通用的使用array_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); 
0

你可以扩展ArrayIterator class并覆盖方法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 
0

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

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

in $ output1是你想要的输出,如果你只想删除'page'indexing'part然后输出$ output2。

如果你需要从该数组中的所有值和索引数值数组,那么你可以使用

$array_1=array_values($samples); 

但我明白,你不想要这个。

49

由于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); 

See it in action

+0

很好,谢谢约翰。我一直在研究PHP 5.5,但我没有看到这个 – 2013-04-02 10:49:59

+10

这应该是现在正确的答案,因为PHP已经添加了内置函数,正是OP所要求的。 – MJoraid 2013-12-31 08:20:12

1
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工作,并降低的情况下,该功能存在

4

那么有。至少对于PHP> 5.5。0,它被称为array_column

PHP函数有一个可选的$index_key参数 - 按照PHP网站 - 规定:

$index_key

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

在这里的答案,我看到一个精简版本,没有可选参数。 我需要它,所以,这里是完整的功能:

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

是的,有一个PHP的内置函数调用array_column这确实你在找什么。

你可以把它叫做$name_keys = array_column($array, 'name');来得到你要找的结果。

请参考PHP手册以下条目了解更多详情:

http://php.net/manual/en/function.array-column.php

+0

感谢kguest让它成为完整的答案。 – Dinesh 2015-05-08 00:15:34

+1

此答案仅在PHP版本大于5时有效。 – Dinesh 2015-05-08 00:17:50

+0

确切地说,大于5.5。 – cytsunny 2015-06-15 05:41:51

0

这是一个非常简单的调用array_reduce。

$valuesOnly = array_reduce($modelData, function ($carry, $item) { 
    return array_merge($carry, $item['id']); 
}, []); 
-1

为了扩展这里的一些答案,从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'); 

通知我选择作为第三个参数列如何成为每个项目的键,并通过我设置为空的第二个参数得到完整的阵列。

当然,最后的用法是设置第二和第三参数。

$d = array_column($a, 'name', 'id'); 

会给你以下。

$d[1] = 'Joe'; 
$d[2] = 'Jane'; 

我个人使用完整的3个参数来创建选择选项列表。如果我有一个包含我的选项的表格,我查询表格并获取结果并将其传递给此列表,以获取包含键值和标签的列表。这是构建需要与索引相交的信息集合的绝佳方式。

0

我想在这里发帖,即使这是一个老问题,因为它仍然是非常相关的,许多开发人员没有使用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']); 

不幸的是,如果传递多个数组,则不能映射密钥。

相关问题