如何从数组中提取特定的字段

3

我有一个数组,看起来像这样

$articles = array([0] => array('title' => 'When ....',
                               'description' => '....', 
                               'created' => '2011-02-21'
                              ), 
                  [1] => array('title' => 'Something ....',
                               'description' => 'When ....', 
                               'created' => '2011-02-21'
                              ),
            );

我想提取标题。有没有办法在不使用for和foreach循环的情况下检索标题。如果标题变成单个字符串,我不介意。我考虑将数组implode,但这会添加描述和创建时间。


1
为什么不使用foreach循环?无论如何做,它的复杂度都是相同的,因为你需要访问每个title - TimCodes.NET
你想要返回什么,标题的数组吗?为什么不使用for/foreach循环呢? - Jacob
foreach有什么问题吗?另外,请更实际地定义“extract”,谢谢。 - Your Common Sense
7个回答

11
考虑到这是CakePHP,$titles = Set::extract('/title', $articles); 编辑: http://book.cakephp.org/view/1487/Set 更新:
自CakePHP 2.x起,Hash已经取代了Set。 $titles = Hash::extract($articles, '{n}.title');

Set::extract 绝对是处理这种情况的最佳方式。没有比它更简洁的方法了。 - Rob Wilkerson

8
你可以使用例如array_map,但为什么不想使用循环?实际上,每种能够以你想要的方式修改数组的方法都会对其进行迭代。
function reduce_to_title ($item) {
  return $item['title'];
};
$titles = array_map('reduce_to_title', $articles);

或者,如果PHP>=5.3

$titles = array_map(function ($item) {
  return $item['title'];
}, $articles);

如果数组元素不存在,则返回空元素,您可以检测。$titles = array_map(function ($item) { return (isset($item['title'])) ? $item['title']: "Empty title";},$articles); - fermin
@Shrapnel:正如我之前所说,这只是一个迭代过程,所以是的,与foreach相比没有任何好处。第二个被称为“闭包”,自PHP5.3以来是新的。它和几乎所有支持匿名函数的语言中的每个匿名函数一样丑陋。但它很短,易读且高效。 - KingCrunch
@fermin:我(隐含地)假设每个内部数组都是“完整的”,但当然你是正确的:你的代码也将处理“损坏”的条目。 - KingCrunch
2
Set::extract('/title', $articles); 就是最简短的写法。 - dogmatic69
@Shrapnel:另外,我说的是“与foreach相比没有优势”,而不是“foreach没有优势”。 - KingCrunch
显示剩余2条评论

5
您可以使用此功能。
print_r(array_map('array_shift', $articles));

编辑:

假设:标题是数组的第一个元素。


假设标题始终是每个嵌套数组的第一个元素,但一个漂亮,清晰,简洁的解决方案。 - Mark Baker

2
自PHP 5.5版本开始,array_column函数正好可以实现您所解释的功能。
$titles = array_column($articles, "title"); // [0=>"When",1=>"Something"]

想要更多的例子请查看PHP手册


0

那 while 循环怎么样?

reset($articles); while($a = each($articles)){echo $a['value']['title'];}

你的例子是一个混淆的for循环。如果你想使用while循环,为什么不尝试这样:reset($articles); while($a = each($articles)){echo $a['value']['title'];} - Martin Hennings
在循环的条件表达式中,永远不应该使用函数。 - KingCrunch
谢谢@Martin,我已经按照你的建议进行了更改。@KingCrunch,这是为什么? - Or Weinberger

0

KingCrunch的答案的改进版本:

function get_column(&$array,$column) {
  foreach ($array as $value) {
    $ret[]=$value[$column];
  }
  return $ret;
}

这是一个非常通用的函数,可以放入某个库中,然后只需一行代码调用,比其他答案中的代码更短:

$titles = get_column($articles, 'title');

更新
然而,看起来cake已经有了这样的功能,因此唯一正确的答案是如何从数组中提取特定字段


0

嘿,既然你正在使用CakePHP,为什么不在find()中的fields数组中添加title呢?例如,下面这个例子:

$this->Article-find('all', array('fields'=>'Article.title'));

将只从数据库中提取所有匹配文章的标题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接