2017-08-11 78 views
0

我试过这样做了一段时间,无法绕过它。我有两个数组。一个阵列包含名为$sendatas的传感器信息,另一个阵列包含将这些传感器分配到的位置,称为$zones将值从一个数组移动到另一个PHP

我希望能够根据传感器是否分配到区域来创建动态HTML复选框,如果它是然后显示一个复选框,如果它不是,则显示一个未选中的复选框。

这是我的阵列的一个示例:

$sendatas阵列:

[1] => Array 
    (
     [hwserial] => 00002025 
     [name] => FG05 Room Temp 
     [serial] => 5 
     [chan] => 1 
     [alarmhigh] => 30 
     [alarmlow] => 5 
     [delay] => 10 
    ) 

[2] => Array 
    (
     [hwserial] => 00002025 01 
     [name] => FG05 Kitchen 1 Freezer 
     [serial] => 5 
     [chan] => 2 
     [alarmhigh] => -10 
     [alarmlow] => -35 
     [delay] => 10 
    ) 

$zones阵列:

[0] => Array 
    (
     [serial] => 1 
     [idGrid] => 50 
     [name] => All Sensors 
    ) 

[1] => Array 
    (
     [serial] => 1 
     [idGrid] => 52 
     [name] => Food Area 
    ) 

[2] => Array 
    (
     [serial] => 2 
     [idGrid] => 50 
     [name] => All Sensors 
    ) 

[3] => Array 
    (
     [serial] => 2 
     [idGrid] => 52 
     [name] => Food Area 
    ) 

[4] => Array 
    (
     [serial] => 3 
     [idGrid] => 50 
     [name] => All Sensors 
    ) 

[5] => Array 
    (
     [serial] => 3 
     [idGrid] => 52 
     [name] => Food Area 
    ) 

[6] => Array 
    (
     [serial] => 4 
     [idGrid] => 50 
     [name] => All Sensors 
    ) 

我的两个区是不一样的长度。我希望能够实现的是通过查找两个数组匹配的序列键来创建一个看起来像这样的数组。

Array 
(
    [0] => Array 
    (
     [hwserial] => 00001216 
     [name] => Fridge Office Thermal 
     [serial] => 1 
     [chan] => 1 
     [alarmhigh] => 8 
     [alarmlow] => -2 
     [delay] => 10 
     [idGrid1] => 50 
     [idGrid2] => 51 
     [idGrid3] => 52 
     [zonename1] => All Sensors 
     [zonename2] => Office 
     [zonename3] => Food Area 
    ) 

[1] => Array 
    (
     [hwserial] => 00002025 
     [name] => FG05 Room Temp 
     [serial] => 5 
     [chan] => 1 
     [alarmhigh] => 30 
     [alarmlow] => 5 
     [delay] => 10 
     [idGrid] => 50 
     [idGrid] => Not Used 
     [idGrid] => 52 
     [zonename1] => All Sensors 
     [zonename2] => Not Used 
     [zonename3] => Food Area 

    ) 

我很确定我可以编写复选框的代码,一旦我有这个数组格式正确。我曾尝试使用一些foreach循环,但只是不断弄乱它。到目前为止,我已经尝试了几个星期,希望能够找到我,但还没有。任何帮助赞赏。

+2

添加您尝试过的代码是在提问时建议的。 – 707

+0

我已经尝试了解它,但不能......我们应该知道什么关键区域去哪里? – Salketer

+0

“串行”的关键是我希望用来匹配它们的关键。我会尝试找到我已经试过的代码 – adamp

回答

1

根据你所说的你试图用这个做什么,我认为它看起来像你试图创建的数组不会那么容易处理。我认为你的传感器阵列很好,你只需要关注$zones阵列。

foreach ($zones as $zone) { 
    $zones_sensors[$zone['idGrid']]['name'] = $zone['name']; 
    $zones_sensors[$zone['idGrid']]['sensors'][$zone['serial']] = true; 
} 

这将重新组织你的$zones阵列中的数据为这种格式:

$zones_sensors = [ 
    50 => ['name' => 'All Sensors', 'sensors' => [1 => true, 2 => true, 3 => true]], 
    51 => ['name' => 'Office', 'sensors' => [1 => true]], 
    52 => ['name' => 'Food Area', 'sensors' => [1 => true, 2 => true, 3 => true]] 
]; 

这提供了你需要输出的复选框,你所描述的两件事情。

  1. 与每个区域相关联的连续的索引集合的完整列表。

你可以用它来输出头的所有区域

foreach ($zones_sensors as $zone_id => $zone) { 
    // output one row with headers for zones 
    echo $zone['name']; // (formatting up to you) 
} 

然后,当你输出的传感器,它会很容易发现哪些区域他们分配。

foreach ($sendatas as $sensor) {      // make a row for each sensor 

    foreach ($zones_sensors as $zone_id => $zone) { // iterate the full list of zones 
     // check if the sensor is allocated to that zone 
     if (isset($zone['sensors'][$sensor['serial']])) { 
      // checkbox is checked 
     } else { 
      // checkbox is unchecked 
     } 
    } 

} 
+0

非常感谢您的帮助。 :) – adamp

+0

不客气! –

0

这应该只是一个创建一个新数组的问题(我们称之为$组合),它是$ sendatas数组中的一个的克隆,但使用[serial]作为关键字,以便您可以锁定特定项目。你将循环遍历$ zones数组,并检查每个项目是否在$ combo中找到[serial],并且如果找到匹配项,将[idgrid]和[name]作为$ combined ['serial']的子数组注入。由于您尚未使用子数组,因此可以添加一个计数器以添加递增数量的值。

-1

沿东西这行应该做的伎俩:

$results = []; 

foreach ($sendatas as $sensor) { 
    $zone_counter = 0; 

    foreach ($zones as $zone) { 
     if ($zone['serial'] == $sensor['serial']) { 
      $zone_counter++; 

      $sensor['idGrid' . $zone_counter] = $zone['idGrid']; 
      $sensor['zonename' . $zone_counter] = $zone['name']; 
     } 
    } 

    $results[] = $sensor; 

    // if you only want $results to contain sensors that actually have zones, 
    // wrap it in an if-statement: 
    // if ($zone_counter > 0) { 
    //  $results[] = $sensor; 
    // } 
} 

print_r($results); 

注意,这不会给你与你所提供的数据进行匹配区域中的任何传感器,因为这两个传感器都具有[serial] => 5和所有您的区域有[serial] => 14。如果你想通过一些其他的键而不是串行来匹配,只需改变if语句。

相关问题