我正在開發一種表單,用戶可以在其中上傳帶有以下標題的資料的檔案。
0-300 | 300-500| 500-1000| 1000-5000|>5000
2.5 | 2.5 | 2.5 | 2.4 | 2.4
1.2 | 1.2 | 1.2 | 1.3 | 1.4
-------------------------------------------
現在我已將此資料作為 json 資料插入到 db 中的一列中。因此,對于第一行資料將生成如下:
[{'lb' : '0'; 'ub': '1000';'value': '2.5'},
{'lb': '1000';'ub': 'INF'; 'value' : '2.4'}]
對于第二行:
[ {'lb' : '0'; 'ub': '1000';'value': '1.2'},
{'lb': '1000';'ub': '5000'; 'value' : '1.3'},
{'lb': 'INF';'ub': 'INF'; 'value' : '1.4'}].
在上面的示例中,我必須將當前值與下一個值進行比較,如果兩者相同,則將創建一個物件,如果我不同,則必須創建第二個物件,依此類推。lb 表示我必須采用第一個節點的下頻帶,而 ub 表示上頻帶。
我正在將 foreach 與 php 的 current 和 next 運算子一起使用,但堅持創建正確的物件。
$slabs = //each row from excel.
foreach($slabs as $key => $value) {
$b = $value;
$c = next($slabs) ?? false;
if($b == $c) {
echo '<pre>';
print_r('YES'); stuck here//
echo '</pre>';
}else{
echo '<pre>';
print_r('NO');
echo '</pre>';
}
}
請幫助我在這種情況下創建邏輯。
$slabs = Array (
[0-300] => 2.5
[300-500] => 2.5
[500-1000] => 2.5
[1000-5000] => 2.5
[>5000] => 2.5
);
uj5u.com熱心網友回復:
您需要遍歷您的平板陣列,每次看到不同的值時輸出一個新物件。我通過兩個功能實作了這一點;第一個 ( key_values) 將鍵拆分為上限和下限,第二個 ( convert_slabs) 回圈遍歷$slabs陣列并按值將其拆分為連續區域。
function key_values($key) {
if ($key[0] == '>') {
[$lower, $upper] = [substr($key, 1), 'INF'];
}
else {
[$lower, $upper] = explode('-', $key);
}
return [$lower, $upper];
}
function convert_slabs($slabs) {
$bounds = array();
$last_value = reset($slabs);
[$lb, $ub] = [$lower, $upper] = key_values(key($slabs));
while ($value = next($slabs)) {
[$lower, $upper] = key_values(key($slabs));
// new entry required?
if ($value != $last_value) {
$bounds[] = (object)['lb' => $lb, 'ub' => $ub, 'value' => $last_value];
[$lb, $ub] = [$lower, $upper];
$last_value = $value;
}
else {
// no, just extend the upper bound
$ub = $upper;
}
}
// add the last object
$bounds[] = (object)['lb' => $lb, 'ub' => $ub, 'value' => $last_value];
return $bounds;
}
測驗代碼(str_replace關于 JSON 轉換只是為了使輸出更具可讀性):
$slabs_array = array(
[ '0-300' => 2.5, '300-500' => 2.5, '500-1000' => 2.5, '1000-5000' => 2.4, '>5000' => 2.4 ],
[ '0-300' => 1.2, '300-500' => 1.2, '500-1000' => 1.2, '1000-5000' => 1.3, '>5000' => 1.4 ],
[ '0-300' => 2.5, '300-500' => 2.5, '500-1000' => 2.5, '1000-5000' => 2.5, '>5000' => 2.5 ],
[ '0-300' => 4.5, '300-500' => 2.5, '500-1000' => 2.5, '1000-5000' => 2.5, '>5000' => 3.5 ],
[ '0-300' => 4.5, '300-500' => 3.5, '500-1000' => 3.5, '1000-5000' => 3.5, '>5000' => 3.5 ],
[ '0-300' => 1.5, '300-500' => 2.5, '500-1000' => 2.5, '1000-5000' => 2.5, '>5000' => 1.5 ],
[ '0-300' => 1.5, '300-500' => 2.5, '500-1000' => 3.5, '1000-5000' => 2.5, '>5000' => 3.5 ],
[ '0-300' => 1.5, '300-500' => 2.5, '500-1000' => 2.5, '1000-5000' => 1.5, '>5000' => 1.5 ]
);
foreach ($slabs_array as $slabs) {
$result = convert_slabs($slabs);
echo str_replace('},{', "},\n{", json_encode($result)) . PHP_EOL . PHP_EOL;
}
輸出:
[{"lb":"0","ub":"1000","value":2.5},
{"lb":"1000","ub":"INF","value":2.4}]
[{"lb":"0","ub":"1000","value":1.2},
{"lb":"1000","ub":"5000","value":1.3},
{"lb":"5000","ub":"INF","value":1.4}]
[{"lb":"0","ub":"INF","value":2.5}]
[{"lb":"0","ub":"300","value":4.5},
{"lb":"300","ub":"5000","value":2.5},
{"lb":"5000","ub":"INF","value":3.5}]
[{"lb":"0","ub":"300","value":4.5},
{"lb":"300","ub":"INF","value":3.5}]
[{"lb":"0","ub":"300","value":1.5},
{"lb":"300","ub":"5000","value":2.5},
{"lb":"5000","ub":"INF","value":1.5}]
[{"lb":"0","ub":"300","value":1.5},
{"lb":"300","ub":"500","value":2.5},
{"lb":"500","ub":"1000","value":3.5},
{"lb":"1000","ub":"5000","value":2.5},
{"lb":"5000","ub":"INF","value":3.5}]
[{"lb":"0","ub":"300","value":1.5},
{"lb":"300","ub":"1000","value":2.5},
{"lb":"1000","ub":"INF","value":1.5}]
3v4l.org 上的演示
uj5u.com熱心網友回復:
我使用了@Nick 的示例資料,因為它有很好的測驗資料,并$array在我的沙盒演示中宣告了它。
第一個松鼠位是決議您的范圍運算式,因為它們的格式不一致。我的片段將從>字串的開頭修剪可選,并附-INF加到字串的末尾,然后決議該新字串并僅隔離由連字符分隔的前兩個值。
接下來,只需跟蹤每次迭代之間的值變化即可。當遇到新值時,推送當前范圍,然后開始一個新范圍。完成迭代后,再推一個條目,這樣最后一個條目就不會從集合中省略。
代碼:(演示)
$result = [];
foreach ($array as $row) {
$merged = [];
$entry = ['lb' => null, 'ub' => null, 'value' => null];
foreach ($row as $range => $value) {
sscanf(ltrim("$range-INF", '>'), '%[^-]-%[^-]', $lowerBound, $upperBound);
if ($value !== $entry['value']) {
if ($entry['lb'] !== null) {
$merged[] = $entry;
}
$entry = ['lb' => $lowerBound, 'ub' => $upperBound, 'value' => $value];
} else {
$entry['ub'] = $upperBound;
}
}
$merged[] = $entry;
echo json_encode($merged) . "\n\n";
}
輸出:(與@Nick 的資料相同)
[{"lb":"0","ub":"1000","value":2.5},{"lb":"1000","ub":"INF","value":2.4}]
[{"lb":"0","ub":"1000","value":1.2},{"lb":"1000","ub":"5000","value":1.3},{"lb":"5000","ub":"INF","value":1.4}]
[{"lb":"0","ub":"INF","value":2.5}]
[{"lb":"0","ub":"300","value":4.5},{"lb":"300","ub":"5000","value":2.5},{"lb":"5000","ub":"INF","value":3.5}]
[{"lb":"0","ub":"300","value":4.5},{"lb":"300","ub":"INF","value":3.5}]
[{"lb":"0","ub":"300","value":1.5},{"lb":"300","ub":"5000","value":2.5},{"lb":"5000","ub":"INF","value":1.5}]
[{"lb":"0","ub":"300","value":1.5},{"lb":"300","ub":"500","value":2.5},{"lb":"500","ub":"1000","value":3.5},{"lb":"1000","ub":"5000","value":2.5},{"lb":"5000","ub":"INF","value":3.5}]
[{"lb":"0","ub":"300","value":1.5},{"lb":"300","ub":"1000","value":2.5},{"lb":"1000","ub":"INF","value":1.5}]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/487395.html
