2010-05-31 72 views
7

采用专有架构,我经常发现自己在我从数据库中获取的格式如下一个结果的情况:PHP数组:流行的单元素数组的数组到一个数组

array(5) { 
    [0] => array(1) { 
    ["id"] => int(241) 
    } 
    [1] => array(1) { 
    ["id"] => int(2) 
    } 
    [2] => array(1) { 
    ["id"] => int(81) 
    } 
    [3] => array(1) { 
    ["id"] => int(560) 
    } 
    [4] => array(1) { 
    ["id"] => int(10) 
    } 
} 

我宁愿有ID,如单个阵列:

array(5) { 
    [0] => int(241) 
    [1] => int(2) 
    [2] => int(81) 
    [3] => int(560) 
    [4] => int(10) 
} 

到那里,我经常发现自己写:

$justIds = array(); 
foreach($allIds as $id) { 
    $justIds[] = $id["id"]; 
} 

有没有更有效的方法来做到这一点?

+1

您使用的是好方法吗?在大多数框架中,有像fetchCol()这样的方法来处理1维特殊情况... – greg0ire 2010-05-31 16:07:30

+0

fetchCol()风格的方法可用,但在很多情况下,我不控制实际获取的内容来自数据库的信息(API调用等)。 – 2010-05-31 16:37:44

回答

9
$out = array_map('array_shift', $in); 

例如,

$in = array(
    array("id" => 241), 
    array ("id" => 2), 
    array ("id" => 81), 
    array ("id" => 560), 
    array ("id" => 10) 
); 
$out = array_map('array_shift', $in); 
var_dump($out); 

打印

array(5) { 
    [0]=> 
    int(241) 
    [1]=> 
    int(2) 
    [2]=> 
    int(81) 
    [3]=> 
    int(560) 
    [4]=> 
    int(10) 
} 
+0

使用'reset'可能更有效,因为'array_shift'改变了传递的数组。编辑:只是测试,使用'重置'给你的例子在我的Windows调试版本6%的改善。 – Artefacto 2010-05-31 16:33:10

+0

使用重置的解决方案会是什么样子? – 2010-05-31 18:18:36

+0

只需用'reset'替换'array_shift'即可。 – VolkerK 2010-05-31 20:35:56

6

随着PHP 5.3,你可以做

$justIds = array_map(
    function($cur) { 
     return $cur['id']; 
    }, 
    $allIds 
); 

随着PHP < 5.3你必须定义一个普通函数,然后通过名称作为字符串array_map( )。

+0

实际上,VolkerK的array_shift版本可能比我自定义的回调更好 – johannes 2010-05-31 16:10:11

+0

另一方面,即使输入数组包含具有多个元素的数组(无论顺序如何),该版本也可以工作。 +1 – VolkerK 2010-05-31 16:12:44

+0

我标记了VolkerK的最佳答案,因为它解决了具体的例子,但是有足够的时间需要处理多元素子阵列,我将能够将两种技术添加到我的库中。感谢你们两位! – 2010-05-31 16:39:22