PHP没有foreach操作数组

时间:2015-03-10 15:25:01

标签: php arrays multidimensional-array foreach

是否有人碰巧知道是否有更高效的方式或单一功能可以实现以下功能而无需foreach循环?我知道下面几乎没有任何性能问题,但我总是在寻找新的,希望更有效的代码编写方法。

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

输入

Array
(
    [0] => Array
        (
            [supplier_id] => 1
            [supplier_company] => Company Alpha
        )

    [1] => Array
        (
            [supplier_id] => 2
            [supplier_company] => Company Beta
        )

)

功能

foreach ($suppliers as $key => $value) {
      $new_array[$value['supplier_id']] = $value['supplier_company'];
}

输出

Array
(
    [1] => Company Alpha
    [2] => Company Beta
)

5 个答案:

答案 0 :(得分:2)

array_column可以解决问题:

$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
)
*/

答案 1 :(得分:1)

您可以使用anonymous functions

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

答案 2 :(得分:1)

正如其他人所提到的那样,

array_column正是如此。

现在,只是为了好玩,你可以尝试在foreach循环中使用extract之类的创意。你的IDE和你的队友都会吵醒你。

foreach($inp as $supplier) {
    extract($supplier);

    // magic variables!
    echo $supplier_id;
    echo $supplier_company;
}

答案 3 :(得分:-1)

如果您使用的是PHP5 >= 5.5.0,则可以尝试array_column,如下所示:

$suppliers = array_column($suppliers, 'supplier_company','supplier_id');
print_r($suppliers);

答案 4 :(得分:-1)

您可以使用构造函数each()提供的函数list(),这是可用的。{/ p>

以下是一个例子:

$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)是安全的!
这样更快,因为您只是指定一个指向内存地址的指针,而不是提供该数组的新副本。