不使用foreach的PHP操作数组
有没有人会碰巧知道,是否有一种更有效的方法或单个函数可以在不需要foreach循环的情况下实现以下功能?我知道它在以下方面几乎没有性能问题,但是我一直在寻找新的、希望更有效的编码方法 (将第一个元素值推送到键值,将第二个元素值推送到新键值,取消设置旧数据) 输入 作用不使用foreach的PHP操作数组,php,arrays,multidimensional-array,foreach,Php,Arrays,Multidimensional Array,Foreach,有没有人会碰巧知道,是否有一种更有效的方法或单个函数可以在不需要foreach循环的情况下实现以下功能?我知道它在以下方面几乎没有性能问题,但是我一直在寻找新的、希望更有效的编码方法 (将第一个元素值推送到键值,将第二个元素值推送到新键值,取消设置旧数据) 输入 作用 foreach ($suppliers as $key => $value) { $new_array[$value['supplier_id']] = $value['supplier_company']; }
foreach ($suppliers as $key => $value) {
$new_array[$value['supplier_id']] = $value['supplier_company'];
}
输出
Array
(
[1] => Company Alpha
[2] => Company Beta
)
这将起到关键作用:
$inp = array(
array(
'supplier_id' => 1,
'supplier_company' => 'Company Alpha'
),array(
'supplier_id' => 2
'supplier_company' => 'Company Beta'
)
);
$out = array_column($inp,'supplier_company','supplier_id');
var_dump($out);
/*
Array
(
[1] => Company Alpha
[2] => Company Beta
)
*/
如果您使用的是
PHP5>=5.5.0
,您可以按如下方式尝试array\u column
:
$suppliers = array_column($suppliers, 'supplier_company','supplier_id');
print_r($suppliers);
您可以将该函数与构造函数一起使用,该函数从那时起就可用
以下是一个例子:
$a=array(
array(
'a'=>0,'b'=>5
),
array(
'a'=>'no','b'=>'yes'
)
);
while(list(,$tmp) = each($a))$new_array[$tmp['a']] = $tmp['b'];
var_dump($new_array);
应输出:
array(2) {
[0]=>
int(5)
["no"]=>
string(3) "yes"
}
这两种方法都是从PHP4开始存在的,因此,您可以永远使用它们
如果您想提高一点点性能,可以使用指针:
while(list(,$tmp) = each(&$a))$new_array[$tmp['a']] = &$tmp['b'];
在之后使用unset($a)
是安全的这会更快,因为您只需将指针分配给内存地址,而不是提供数组的新副本。您可以使用:
正如其他人所提到的,
array\u column
正是这样做的
现在,为了好玩,您可以尝试一些创造性的方法,比如在foreach循环中使用extract
。你的IDE和你的队友都会对你发出刺耳的声音
foreach($inp as $supplier) {
extract($supplier);
// magic variables!
echo $supplier_id;
echo $supplier_company;
}
由于您没有使用
$key
值,因此可以消除$key=>
循环的一部分,也可以使用foreach($suppliers as&$value)
。正如在另一条评论中所说,这将加快代码的速度,因为您将访问指针,而不是复制数据。之后,您可以安全地使用unset($suppliers)
。对不起,在阅读其他评论之前,我开始键入答案并进行测试。我已经删除了重复的部分。不过,我的其余答案相当新颖;)没有反对的理由。尽管它是原创的,但要求不要使用foreach
。您可以使用foreach($inp as&$supplier)
来提高速度(因为您将使用指针而不是复制内存)。不管怎样,我还是投了更高的票。
$arr = array
(
0 => array
(
'supplier_id' => 3,
'supplier_company' => 'Company Alpha'
),
1 => array
(
'supplier_id' => 4,
'supplier_company' => 'Company Beta'
)
);
$names = array_map(function ($arg){return array($arg['supplier_id']=>$arg['supplier_company']);}, $arr);
foreach($inp as $supplier) {
extract($supplier);
// magic variables!
echo $supplier_id;
echo $supplier_company;
}