如何使用PHP构造具有特定键的数组?

时间:2015-11-25 14:55:19

标签: php arrays

我有一个包含4个元素$device_report = [];的数组,其中包含这些数据

array:4 [▼
  0 => array:2 [▼
    "up_bytes" => 2818
    "down_bytes" => 948
  ]
  1 => array:2 [▼
    "up_bytes" => 472
    "down_bytes" => 439
  ]
  2 => array:2 [▼
    "up_bytes" => 3364
    "down_bytes" => 1317
  ]
  3 => array:2 [▼
    "up_bytes" => 3102
    "down_bytes" => 1682
  ]
]

现在,我有这个

    $device_report = [];
    foreach ($devices as $device){
        $device_mac = $device->device_mac; //080027E2FC7D
        $data = VSE::device($device_mac);
        array_push($device_report,$data);
    }

我试过

    $device_report = [];
    foreach ($devices as $device){
        $device_mac = $device->device_mac; //080027E2FC7D
        $data = VSE::device($device_mac);
        array_push($device_report[$device_mac],$data);
    }

它给我错误:

array_push() expects parameter 1 to be array, null given

我只想将我的密钥作为特定设备的Mac地址而不是0,1,2,3。

任何提示都将不胜感激!

3 个答案:

答案 0 :(得分:2)

根据文档array_push

  

int array_push ( array &$array , mixed $value1 [, mixed $... ] )

     

array_push()数组视为堆栈,并将传递的变量推送到数组的末尾。数组的长度增加了推送的变量数。具有与以下相同的效果:

在您的特定情况下,您尝试创建新密钥并分配数组,因此您会收到$device_report[$device_mac]不是数组的错误。这确实是正确的,因为密钥尚不存在。

要解决此问题,请直接指定数组,而不是使用array_push

试试这个:

$device_report[$device_mac] = $data;

而不是:

array_push($device_report[$device_mac], $data);

答案 1 :(得分:1)

尝试以下方法:

$device_report = [];
foreach ($devices as $device){
    $device_mac = $device->device_mac; //080027E2FC7D
    $data = VSE::device($device_mac);

    //add this to init the array.
    if (is_array($device_report[$device_mac]) === false) {
        $device_report[$device_mac] = [];
    }

    array_push($device_report[$device_mac],$data);
}

出现错误消息,因为$device_report[$device_mac]为空。您必须使用数组初始化值。使用以下代码,如果没有可用的数组,则使用空数组初始化它:

//add this to init the array.
if (is_array($device_report[$device_mac]) === false) {
    $device_report[$device_mac] = [];
}

答案 2 :(得分:1)

我不会为此使用array_push。没理由。

$device_report = [];
foreach ($devices as $device){
    $device_mac = $device->device_mac; //080027E2FC7D
    $data = VSE::device($device_mac);
    $device_report[$device_mac]=$data; // <-- This line changed
}