2017-08-11 77 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語句。

相關問題