我今天對 PHP 感到特別愚蠢和無能,所以正在尋求建議。我根本無法計算出從我的多維陣列中提取所需資訊的邏輯。我希望聰明善良的人可以幫助我克服我的心理障礙!
我有一個多維的香氣觀察陣列,如下所示:
$aroma_observations = array(
[0] => Array ( [sample] => 9043 [aroma] => NUT [intensity] => 1 )
[1] => Array ( [sample] => 9043 [aroma] => NUT [intensity] => 2 )
[2] => Array ( [sample] => 9043 [aroma] => SPICE [intensity] => 2 )
[3] => Array ( [sample] => 9043 [aroma] => SPICE [intensity] => 2 )
[4] => Array ( [sample] => 9043 [aroma] => SPICE [intensity] => 1 )
[5] => Array ( [sample] => 9043 [aroma] => PEPPER [intensity] => 1 )
[6] => Array ( [sample] => 9043 [aroma] => PEPPER [intensity] => 1 )
[7] => Array ( [sample] => 9043 [aroma] => PEPPER [intensity] => 2 )
[8] => Array ( [sample] => 9043 [aroma] => WOOD [intensity] => 2 )
[9] => Array ( [sample] => 9043 [aroma] => WOOD [intensity] => 2 )
[10] => Array ( [sample] => 9043 [aroma] => WOOD [intensity] => 2 )
[11] => Array ( [sample] => 4585 [aroma] => SPICE [intensity] => 1 )
[12] => Array ( [sample] => 4585 [aroma] => SPICE [intensity] => 2 )
[13] => Array ( [sample] => 4585 [aroma] => HERB [intensity] => 1 )
[14] => Array ( [sample] => 4585 [aroma] => HERB [intensity] => 2 )
[15] => Array ( [sample] => 4585 [aroma] => WOOD [intensity] => 2 )
[16] => Array ( [sample] => 4585 [aroma] => WOOD [intensity] => 2 )
[17] => Array ( [sample] => 4585 [aroma] => WOOD [intensity] => 2 )
[18] => Array ( [sample] => 2466 [aroma] => SPICE [intensity] => 1 )
[19] => Array ( [sample] => 2466 [aroma] => SPICE [intensity] => 2 )
[20] => Array ( [sample] => 2466 [aroma] => SWEET [intensity] => 1 )
[21] => Array ( [sample] => 2466 [aroma] => SWEET [intensity] => 1 )
[22] => Array ( [sample] => 2466 [aroma] => SWEET [intensity] => 2 )
[23] => Array ( [sample] => 2466 [aroma] => WOOD [intensity] => 2 )
[24] => Array ( [sample] => 2466 [aroma] => WOOD [intensity] => 3 ) )
我需要創建一個陣列,將其降低到每個樣品的每種香氣的最大強度- 如下所示:
$aroma_max_intensities = array (
[0] => Array ( [sample] => 9043 [aroma] => NUT [intensity] => 2 )
[1] => Array ( [sample] => 9043 [aroma] => SPICE [intensity] => 2 )
[2] => Array ( [sample] => 9043 [aroma] => PEPPER [intensity] => 2 )
[3] => Array ( [sample] => 9043 [aroma] => WOOD [intensity] => 2 )
[4] => Array ( [sample] => 4585 [aroma] => SPICE [intensity] => 2 )
[5] => Array ( [sample] => 4585 [aroma] => HERB [intensity] => 2 )
[6] => Array ( [sample] => 4585 [aroma] => WOOD [intensity] => 2 )
[7] => Array ( [sample] => 2466 [aroma] => SPICE [intensity] => 2 )
[8] => Array ( [sample] => 2466 [aroma] => SWEET [intensity] => 2 )
[9] => Array ( [sample] => 2466 [aroma] => WOOD [intensity] => 3 ) )
我一直在尋找最好的編碼方式,但一無所獲,因此非常感謝任何建議。
德國之聲
uj5u.com熱心網友回復:
您可以使用array_reduce回圈瀏覽這些專案,然后檢查該特定樣品/香氣的強度,如果它更高,則增加強度。
$results = array_values(array_reduce($aroma_observations, function($acc, $item) {
if (!isset($acc[$item['sample'].$item['aroma']])) {
$acc[$item['sample'].$item['aroma']] = $item;
}
if ((int)$item['intensity'] > $acc[$item['sample'].$item['aroma']]['intensity']) {
$acc[$item['sample'].$item['aroma']]['intensity'] = (int)$item['intensity'];
}
return $acc;
}, []));
uj5u.com熱心網友回復:
從技術上講,這不是一個多維陣列,而是一個關聯陣列的陣列,可以“視為”一個物件陣列,其中每個物件具有以下結構:
[
"sample" => ...,
"aroma" => ...,
"intensity" => ...,
]
所以你可以像處理一維陣列一樣處理這個問題,然后對每個條目的值做一些事情。其中每個條目將是如上所述的“物件”。
現在,預期的結果也將是這些“物件”的陣列,但只有強度最高的物件,所以你想要做的基本上是過濾原始陣列。
對于每個問題,總是有多種可能的解決方案,但這是我要做的:
我會保留一個索引,其中包含指向 $aroma_observations 中每個給定組合(樣品,香氣)的強度最高的條目的指標。
所以這個索引看起來像這樣:
[
"sampleA.aromaA" => x,
"sampleA.aromaB" => y,
...
]
其中 x, y... 是 $aroma_observations 中包含迄今為止最高強度的索引。
$indexOfMax = [];
for ($i = 0; $i < count($aroma_observations); $i ) {
$entry = $aroma_observations[$i];
$indexOfMaxKey = "{$entry['sample']}.{$entry['aroma']}";
if (!isset($indexOfMax[$indexOfMaxKey])) {
// If the combination sample.aroma hasn't been indexed,
// then add it now
$indexOfMax[$indexOfMaxKey] = $i;
} else {
// The combination sample.aroma is in the index
// Now, we compare the indexed intensity with the
// current entry's intensity and update the index
// if this new entry has a higher intensity
// Take the pointer to the indexed aroma observation
$indexedMax = $indexOfMax[$indexOfMaxKey];
// Take the intensity corresponding to the indexed aroma observation
$indexedIntensity = $aroma_observations[$indexedMax]['intensity'];
if ($entry['intensity'] > $indexedIntensity) {
$indexOfMax[$indexOfMaxKey] = $i;
}
}
}
echo '<pre>' . print_r($indexOfMax, true) . '</pre>';
然后,在完全填充 $indexOfMax 的情況下,我將構建結果陣列:
$result = [];
foreach ($indexOfMax as $key => $indexOfValue) {
$parts = explode('.', $key);
$sample = $parts[0];
$aroma = $parts[1];
$intensity = $aroma_observations[$indexOfValue]['intensity'];
$result[] = [
'sample' => $sample,
'aroma' => $aroma,
'intensity' => $intensity,
];
}
echo '<pre>' . print_r($result, true) . '</pre>';
uj5u.com熱心網友回復:
嘗試使用此代碼sample and aroma key of array
<?PHP
echo "<pre>";
$final_array = [];
foreach($aroma_observations as $arr){
$final_array[$arr['sample'].'-'.$arr['aroma']]['sample'] = $arr['sample'];
$final_array[$arr['sample'].'-'.$arr['aroma']]['aroma'] = $arr['aroma'];
$final_array[$arr['sample'].'-'.$arr['aroma']]['intensity'] = (isset($final_array[$arr['sample']-$arr['aroma']]['intensity'])) ? $final_array[$arr['sample']-$arr['aroma']]['intensity'] $arr['intensity'] : $arr['intensity'];
}
$final_array = array_values($final_array);
print_r($final_array);
?>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/465656.html
上一篇:PHP-簡單表格
下一篇:PHPnatsort忽略可選前綴
