Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不使用foreach的PHP操作数组_Php_Arrays_Multidimensional Array_Foreach - Fatal编程技术网

不使用foreach的PHP操作数组

不使用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循环的情况下实现以下功能?我知道它在以下方面几乎没有性能问题,但是我一直在寻找新的、希望更有效的编码方法

(将第一个元素值推送到键值,将第二个元素值推送到新键值,取消设置旧数据)

输入

作用

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