Heim > Artikel > Backend-Entwicklung > Bitte helfen Sie mir mit diesem einfachen Algorithmus
Der Text ist nicht gut, bitte verbessern Sie ihn
Eine Reihe von Benutzer-IDs
<code>$uids = [1,2,3,5,6,8,9,11,13,25,65];</code>
Jeder Schlüsselwert in diesem Array stellt eine UID dar
Betragsarray
<code>$amounts = [ 1=>12000, 2=>500, 3=>11000, 5=>1000, 6=>11000, 8=>12000, 9=>12000, 11=>11000, 13=>12000, 25=>22000, 65=>123123 ];</code>
Der Schlüsselname dieses Arrays entspricht dem Schlüsselwert des $uid-Arrays.
Durchlaufen Sie das $uids-Array und entnehmen Sie den entsprechenden Betrag $amount.
Wenn der Betrag größer oder gleich 12000 ($boundary) ist, addieren Sie den $amount zum Gesamtbetrag ($totals)
Wenn der Betrag weniger als 12.000 beträgt, führen Sie eine Abwärtsschleife durch, bis die Summe dieser $-Beträge größer oder gleich 12.000 ist. Addieren Sie dann die Summe dieser $-Beträge zum Gesamtbetrag ($totals)
und nehmen Sie bis auf drei Ebenen.
Ermitteln Sie endlich den Wert von $totals.
Mein aktueller Code:
<code><?php $boundary = 12000; $uids= [1,2,3,5,6,8,9,11,13,25,65]; $amounts = [ 1=>12000, 2=>500, 3=>11000, 5=>1000, 6=>11000, 8=>12000, 9=>12000, 11=>11000, 13=>12000, 25=>22000, 65=>123123 ]; $totals = 0; foreach($uids as $k => $uid){ $amont = $amounts[$uid]; if($amont >= $boundary){ $totals += $amont; }else{ $next = get_next($uids ,$k+1 ,$amont); if($next && is_array($next)){ $curKey = $next[0]; //amouts index 3 $totals+=$next[2]; //再向下获取一层 $nextKey = $curKey+1; if(!isset($uids[$nextKey])){ break; } $nextUid = $uids[$nextKey]; $nextAmount = $amounts[$nextUid]; if($nextAmount >= $boundary){ $totals+=$nextAmount; }else{ $last = get_next($uids ,$nextKey+1 ,$nextAmount); if($last && is_array($last)){ $totals+=$last[2]; } } } break; //跳出主循环 } } echo $totals; exit; function get_next($uids ,$start ,$prevAmount){ global $amounts ,$boundary; $leaves = array_slice($uids ,$start ,count($uids),true); if($leaves){ foreach($leaves as $k=>$uid){ $amount = $prevAmount+$amounts[$uid]; if($amount >= $boundary){ return [$k ,$uid ,$amount]; break; }else{ return get_next($uids ,$k+1 ,$amount); } } } return 0; }</code>
Erhalten Sie insgesamt $47500
Der Text ist nicht gut, bitte verbessern Sie ihn
Eine Reihe von Benutzer-IDs
<code>$uids = [1,2,3,5,6,8,9,11,13,25,65];</code>
Jeder Schlüsselwert in diesem Array stellt eine UID dar
Betragsarray
<code>$amounts = [ 1=>12000, 2=>500, 3=>11000, 5=>1000, 6=>11000, 8=>12000, 9=>12000, 11=>11000, 13=>12000, 25=>22000, 65=>123123 ];</code>
Der Schlüsselname dieses Arrays entspricht dem Schlüsselwert des $uid-Arrays.
Durchlaufen Sie das $uids-Array und entnehmen Sie den entsprechenden Betrag $amount.
Wenn der Betrag größer oder gleich 12000 ($boundary) ist, addieren Sie den $amount zum Gesamtbetrag ($totals)
Wenn der Betrag weniger als 12.000 beträgt, führen Sie eine Abwärtsschleife durch, bis die Summe dieser $-Beträge größer oder gleich 12.000 ist. Addieren Sie dann die Summe dieser $-Beträge zum Gesamtbetrag ($totals)
und nehmen Sie bis auf drei Ebenen.
Ermitteln Sie endlich den Wert von $totals.
Mein aktueller Code:
<code><?php $boundary = 12000; $uids= [1,2,3,5,6,8,9,11,13,25,65]; $amounts = [ 1=>12000, 2=>500, 3=>11000, 5=>1000, 6=>11000, 8=>12000, 9=>12000, 11=>11000, 13=>12000, 25=>22000, 65=>123123 ]; $totals = 0; foreach($uids as $k => $uid){ $amont = $amounts[$uid]; if($amont >= $boundary){ $totals += $amont; }else{ $next = get_next($uids ,$k+1 ,$amont); if($next && is_array($next)){ $curKey = $next[0]; //amouts index 3 $totals+=$next[2]; //再向下获取一层 $nextKey = $curKey+1; if(!isset($uids[$nextKey])){ break; } $nextUid = $uids[$nextKey]; $nextAmount = $amounts[$nextUid]; if($nextAmount >= $boundary){ $totals+=$nextAmount; }else{ $last = get_next($uids ,$nextKey+1 ,$nextAmount); if($last && is_array($last)){ $totals+=$last[2]; } } } break; //跳出主循环 } } echo $totals; exit; function get_next($uids ,$start ,$prevAmount){ global $amounts ,$boundary; $leaves = array_slice($uids ,$start ,count($uids),true); if($leaves){ foreach($leaves as $k=>$uid){ $amount = $prevAmount+$amounts[$uid]; if($amount >= $boundary){ return [$k ,$uid ,$amount]; break; }else{ return get_next($uids ,$k+1 ,$amount); } } } return 0; }</code>
Erhalten Sie insgesamt $47500