Archief - PHP: De hoogste waarde uit array nemen

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Black Night

Legacy Member
llo :)

Ik zou een bepaalde waarde willen laten afhangen van het aantal objecten dat een gebruiker in een database heeft. Voorbeeld:

0 objecten => gebruiker krijgt waarde 1
5 objecten => gebruiker krijgt waarde 10
50 objecten => gebruiker krijgt waarde 11
100 objecten => gebruiker krijgt waarde 12
...

Ik heb dit in een array geplaatst. Voorbeeld:

array("1"=>"0", "10"=>"5", "11"=>"50", "12"=>"100", ...);


Hoe kan ik nu de hoogste key selecteren? Bv als de gebruiker 50 tot 99 objecten heeft, moet hij key 11 krijgen. Meestal neemt hij de laagste waarde :s

Indien de array beter omgekeerd is: geen probleem :)

Dank bij voorbaat :)

killgore

Legacy Member
mja, die 50 tot 99 objecten, hoe sla je dat op?
als je het als $aantalobjecten opslaat:
PHP:
foreach($array as $key =>$value)
{
    if($aantalobjecten<$value) break;
    $hoogste_key = $key;
}

op voorwaarde dat je array gesorteerd is naar oplopende key: ksort($array);

Black Night

Legacy Member
Is er echt geen functie die daaraan beantwoordt? :s

Ik heb hier ook bezig gezeten met een loop, maar als de array wat lang wordt, kan het zijn dat die loop vrij lang moet zoeken...

In alle geval: danku :)

taLa.

Legacy Member
PHP:
define("_NL", "<br/>\n");

$map = array(
	array(1, 0),
	array(10, 5), 
	array(11, 50),
	array(12, 100),
);

function getLevel($number){
	
	global $map;
	$res = -1;
	$cnt = count($map);
	
	for($i=0;$i<$cnt;$i++){
		if($i < $cnt-1){
			if($number >= $map[$i][1] && $number < $map[$i+1][1]){
				$res = $map[$i][0];
				break;
			}
		} else {
			if($number >= $map[$i][1]){
				$res = $map[$i][0];
				break;
			}
		}
	}
	
	return $res;
	
}

echo "0: ".getLevel(0)._NL;				// 1
echo "7: ".getLevel(7)._NL;				// 10
echo "49: ".getLevel(49)._NL;			// 10
echo "50: ".getLevel(50)._NL;			// 11
echo "99: ".getLevel(99)._NL;			// 11
echo "100: ".getLevel(100)._NL;			// 12
echo "1000: ".getLevel(1000)._NL;		// 12

Black Night

Legacy Member
Er zit blijkbaar geen andere oplossing op dan een loop te nemen.

Bedankt voor de hulp! :)

Black Night

Legacy Member
Deze functie werkt toch niet als de waarde niet in de array zit?

killgore

Legacy Member
GuntherDW zei:
en waarom zou er daarvoor geen functie voor zijn?
http://php.net/max
omdat dat niet is wat hij vroeg :), gij haalt gewoon grootste waarde uit array ;).

en tala., wtf maakt gij da zo ingewikkeld als ik hier al veel simpelere versie had gepost :s?
in functie gegoten:
PHP:
$basiclevelarray = array("1"=>"0", "10"=>"5", "11"=>"50", "12"=>"100", ...);
function getlevel($nr,$levelarray=null)
{
    global $basiclevelarray;
    if(!isset($levelarray) && isset($basiclevelarray)) $levelarray=$basiclevelarray;
    else return 0;
    $array = ksort($levelarray);
    reset($array);
    foreach($array as $key =>$value)
    {
        if($aantalobjecten<$value) return $level;
        $level = $key;
    }
}
kbetwijfel da ge aan die laatste veel mis kunt doen en is vrij extreem algemeen :p

Black Night

Legacy Member
Ok, ik heb reeds een variant van killgore's functie gescript en werkt nu tiptop :)

Bedankt voor de reacties!

Black Night

Legacy Member
dan moet je toch ook nog altijd ieder aantal objecten in de array zetten?

killgore

Legacy Member
Jos_Albatros zei:
combineer gewoon max() en array_keys () ...
werkt ook niet, hij heeft de waarde die hij zoekt niet noodzakelijk als key staan, de loops die hier gepost staan zijn echt enige oplossingen hoor ;).

Jos_Albatros

Legacy Member
killgore zei:
werkt ook niet, hij heeft de waarde die hij zoekt niet noodzakelijk als key staan, de loops die hier gepost staan zijn echt enige oplossingen hoor ;).
idd, ni genoeg gelezen :doh:

@ uw voorbeeld, dit stukje :

$array = ksort($levelarray);
reset($array);
foreach($array as $key =>$value)

ksort returned 1 of 0 terug, geen key-gesorteerde array,
$array is dus een int, dus die foreach zal niet werken ..

@ Black Night

maak van u gegevens in u array integers, anders kunt ge niet vergelijken

een oplossing :
PHP:
<?

$list = array (1 => 0, 10 => 5, 11 => 50, 12 => 100);

function z ($i) {

	global $list;

	foreach ($list as $key => $value) {
		if ($value > $i) {
			$keys = array_keys ($list);
			return $keys [array_search (array_search ($value, $list), $keys) - 1];
		}
	}
}

print z (0); // 1
print z (1); // 1
print z (4); // 1
print z (5); // 10
print z (6); // 10

?>

Black Night

Legacy Member
even eens uw code ontleden, want da ziet er mij al vrij staffe toebak uit

Danke voor de info :)

killgore

Legacy Member
Jos_Albatros zei:
$array = ksort($levelarray);
reset($array);
foreach($array as $key =>$value)

ksort returned 1 of 0 terug, geen key-gesorteerde array,
$array is dus een int, dus die foreach zal niet werken ..
moete daarom gans nieuwe code geven en doen alsof ge et zelf gevonde hebt terwijl ge gewoon mijn opl. kopieert met iets ingewikkelder en tergend veel tragere structuur :ironic:.
tis idd
$array=$levelarray;
ksort($levelarray);

en fyi: der is implicit casting bij php

Jos_Albatros

Legacy Member
killgore zei:
moete daarom gans nieuwe code geven en doen alsof ge et zelf gevonde hebt terwijl ge gewoon mijn opl. kopieert
lol man, ik post hier gewoon MIJN oplossing hoe IK het zou doen,
denkt gij nu echt dat ik die paar regeltjes van u kopieer en dan keihard lig na te denken om het een beetje te camoufleren om u zo te kloten,
haha
killgore zei:
met iets ingewikkelder en tergend veel tragere structuur
gij kunt nanoseconden tellen ofwa ? cool :bow:
---
goe bezig man, echt GOE bezig :niceone:

zero2one

Legacy Member
euh, ik wil niet muggeziften maar...
PHP:
$basiclevelarray = array("1"=>"0", "10"=>"5", "11"=>"50", "12"=>"100", ...);
function getlevel($nr,$levelarray=null)
{
    if(!isset($levelarray) && isset($basiclevelarray)) $le...
zal niet werken daar $basiclevelarray buiten de functie staat...
PHP:
$basiclevelarray = array("1"=>"0", "10"=>"5", "11"=>"50", "12"=>"100", ...);
function getlevel($nr,$levelarray=null)
{
    global $basiclevelarray;
    if(!isset($levelarray) && isset($basiclevelarray)) $le...
zal het wel doen ;)

killgore

Legacy Member
zero2one zei:
euh, ik wil niet muggeziften maar...
zal niet werken daar $basiclevelarray buiten de functie staat...
zal het wel doen ;)
sjust :). aangepast, blijkbaar veel domme fouten gemaakt vandaag :p.

killgore

Legacy Member
Jos_Albatros zei:
lol man, ik post hier gewoon MIJN oplossing hoe IK het zou doen,
denkt gij nu echt dat ik die paar regeltjes van u kopieer en dan keihard lig na te denken om het een beetje te camoufleren om u zo te kloten,
haha

gij kunt nanoseconden tellen ofwa ? cool :bow:
---
goe bezig man, echt GOE bezig :niceone:
srry @ mods dak even bovenhaal, kwas vergeten dak men vorige reply hierop gedelete had.

Wat ik bedoelde was da gij gewoon wou opscheppen: kijk ik kan het ook, terwijl dat voor niets nodig was aangezien er al vrij perfect antwoord bovenstond, buiten die 2 fouten in de functie-vorm die puur kwamen omdat ik het gewoon in de browser zelf had getypt en nooit men code had getest. Maar nee, ipv mijn code te verbeteren moet je eventjes snel zelf een code-vb geven met enkele rare constructies om te tonen dat je wel goed php kan. De reden wrom ik zei dat je mijn code gewoon had aangepast was het gebruik van for each en die functies van jou. Met gebruik van array_keys e.d. ga je zeer vaak via for op numerical index iteraten en NIET via foreach ;).

en ja ik kan nano-seconden tellen :), uw code is beduidend trager, da ziet iedereen die een beke kan coden.

edit: fyi: onleesbare combinaties van array-functies maken wilt niet zeggen dat je goed kan coden :).
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan