2016-10-26 40 views
-4

在PHP中,是否有一個數組函數與下面的代碼做同樣的事情?我想知道是否有可能用array_maparray_reduce之類的東西,$items數組不需要事先聲明。在PHP中有一個數組函數而不是foreach循環嗎?

$data = [ 
    ['order_product_id' => 123, 'quantity' => 1], 
    ['order_product_id' => 456, 'quantity' => 2], 
    ['order_product_id' => 567, 'quantity' => 3], 
]; 

$items = []; 

foreach ($data as $item) { 
    $items[$item->order_product_id] = ['quantity' => $item->quantity]; 
} 

print_r($items); 

/* 
Array 
(
    [123] => ['quantity' => 1] 
    [456] => ['quantity' => 2] 
    [789] => ['quantity' => 3] 
) 
*/ 
+1

是有用的foreach()中的問題? – nogad

+0

沒有問題。這只是一個問題。 – flyingL123

+1

爲什麼禁止initializng'$ items'?你想修改'$ data'嗎? – bishop

回答

0

Array_reduce將做你想做的事情,因爲它隱藏了'carry'或'accumulator'參數的'初始值'中輸出數組的聲明。另外,它並不是「減少」,而是實際上將輸入項添加到輸出中。

imo,將callbackcarry參數設爲accumulator更有用。在這種情況下,'累加器'是一個數組,我們正在添加條目。

imo,它不像原來的版本那麼容易理解。並不是更快。

$data = [ 
    (object) ['order_product_id' => 123, 'quantity' => 1], 
    (object) ['order_product_id' => 456, 'quantity' => 2], 
    (object) ['order_product_id' => 567, 'quantity' => 3], 
]; 


$items = array_reduce($data, 
      function ($out, $item) { 
       $out[$item->order_product_id] = ['quantity' => $item->quantity]; 
       return $out;          
      }, 
      array()); 

print_r($items); 

輸出:

Array(
    [123] => Array([quantity] => 1) 

    [456] => Array([quantity] => 2) 

    [567] => Array([quantity] => 3) 
) 
+0

演示:https://eval.in/666416 –

4

您可以使用array_map做到這一點:

<?php 
$data = [ 
    ['order_product_id' => 123, 'quantity' => 1], 
    ['order_product_id' => 456, 'quantity' => 2], 
    ['order_product_id' => 567, 'quantity' => 3], 
]; 

$items = []; 

array_map(function ($item) use (&$items) { 
    $items[$item['order_product_id']] = ['quantity' => $item['quantity']]; 
}, $data); 

您可以使用兩種array_map要求也需要這樣做:

$keys = array_map(function ($item) { 
    return $item['order_product_id']; 
}, $data); 

$values = array_map(function ($item) { 
    return ['quantity' => $item['quantity']]; 
}, $data); 

$items = array_combine($keys, $values); 

或者,如果你不希望任何聲明臨時變量:

$items = array_combine(
    array_map(function ($item) { 
     return $item['order_product_id']; 
    }, $data), 
    array_map(function ($item) { 
     return ['quantity' => $item['quantity']]; 
    }, $data) 
); 

它們都不如foreach有效。

+0

對不起,應該是更具體。有沒有辦法做到這一點,而不必首先聲明'$ items'數組? – flyingL123

+0

AKAIK沒有默認的php函數來以您想要的方式替換數組鍵。雖然有很多方法來獲得物品。如果你願意,我可以爲你命名一些。 –

+2

我同意沃爾森在這裏。沒有默認功能。 'array_map'的解釋基本上和foreach一樣。你太過於複雜的問題flyingL123。 – Darren

相關問題