nfTlWNl rn Ѻq$³*%yNk9S maq ƿfX5O&B CӝINgþq ] OEa3dEwԞX^\`Lٔ*ܝIc3ٿ ZmW2d.kغkGrJsf]ZV hHWgq!`P D\i7*cy,֐á.]<ՙH 4Z݊υNRg305ɱ5nzCh ˗ݐ 2- fY>d'#X &81b1*Kx5[KՈRͺ:+B<P̻c˟.: TM0V~Y< xfF EV2m_~3 UqRZ#cuN xj2$c#"@SsB(r8P}~3a;uydY huWK)xds@tAVrbKKAlvEݘE+b8k@Wĝ "w:xւǢTgD@`נDljv|+) iΊx=.Yo`s?ׯ"kaU{rݚ,J!Zד<e7;%7,0گrwW_7*e.BG>l*|W(n Zy-w NErw=9i\1m*Aycwkk}6Rl:&Ƨ1ud㤊poq6)R%6fvXNH` 6M< G¾^ZmC,xϫ(OR2Ψ;986f5b9& +t0?+.mN1ia* '(B+{=BѮř\i4?( B 7{/06r}1~Vi c{YZYNZ+Kc͌l0Cw,ԽuN9WsO,JlgakVxG*oeo:~:APN^f␣c6F!Det_U5E+U Bit,QU/xy>es<2k_T0/='߳Ȩ@ѩj'@|܂Kn š"O%]p!vTVIc'zn]놵9,/,Y.;Ϋo}Y3un/<9Enim6 N*c-P^?//4ƅ,.ݨt00ʴ;D%  ->S=Ӧ,]3D &"a>b2Ѐu0qZ96řW=VK)T#GCX( +Nb[$h[x#C{,I2a4w5$mǀ9Ck2 GM|Ns_J+>͕Lq0MZ4ҹ}üXcb<>\L.zK{)vD@̶"Hߔ49)NP@ɖM7nzH)~YTX2ZœMG0> ̸^:ʼnj5Nf*|GF{*Y)p ޹^qf.`խ 7@ C Ɔu9{xL`jA^e:εt<phK=DŽTzpŢ>pTT859/"ucH+ PFYM3f>ğ@[: ٗ43x&Ql˿6 ۫J.Mm/?P V[be8?>.Fk7H ߎ}w5h&}qw(B)$?G'ڷْMfpL: _$07T$Wzc\slvEݘE+b8G#caO;N/SIąLhZx%i;cI~}2 )BxM A_Jh)pֽ;&b&y˭49 L$?0ZEB_WۤX <1*OC]j1Jh:זNՙtMK-#T .#B+"#p/ZjpWc)9-%B8C|@ ^n:6n)!r Cb2zBqVˡ&ޢ\ye =J&/co^-˾NK"sQqت|-S6EyVN49YW.#&WUx q}z3J.(ѰR7DJ`q`D3t_t*]Er%'ؤLXbm (]0YF8/nim6'fwUQ#i !ۀiݚLT;MKم@ȗpC(Px,O.K3lx%eYH.bU y@`&^/$q"hSj`iMy!m$;@Ko,Q$Tz5鸒]V}0]L0_b|a]*`zyt*5/-;3_6xE\# |l3ROjO7uYͩMK-#T .#;_7c@TN7"#EUQhVQM+%D? ws ऩIW?P%Z%K|ה[Z2bAes\V&&.U7 ĢQ$3 2a 7>Kt/8Oh2^8&F#`.69N]/Z~n*U=*١2o`Xs3;0?5K]6 ym԰֐خ냲d폭w:TS>9 9c[ޟ)\_e}y[ 9|¬WĶ3h9N{ N2<l{\oIU] [e3F#P8rKQ`v٣598zπh#t^+avqlUGPL%Pq4?b] "֮}$k{C[j{R~=eaNB];n!4m˥ݩ: )(\)x4Uj0I9q*qI\V;úz]DS=i'pA۔Q.IvxBrZ! D!=B=k5*Ȁ%ד!{n 759Y.6lֵgetMessage(); } $entry = floor($entry); $entry /= 4; if (($entry < 0) || ($entry > 1)) { return ExcelError::NAN(); } return self::PERCENTILE($aArgs, $entry); } /** * RANK. * * Returns the rank of a number in a list of numbers. * * @param mixed $value The number whose rank you want to find * @param mixed $valueSet An array of float values, or a reference to, a list of numbers * @param mixed $order Order to sort the values in the value set * * @return float|string The result, or a string containing an error (0 = Descending, 1 = Ascending) */ public static function RANK($value, $valueSet, $order = self::RANK_SORT_DESCENDING) { $value = Functions::flattenSingleValue($value); $valueSet = Functions::flattenArray($valueSet); $order = ($order === null) ? self::RANK_SORT_DESCENDING : Functions::flattenSingleValue($order); try { $value = StatisticalValidations::validateFloat($value); $order = StatisticalValidations::validateInt($order); } catch (Exception $e) { return $e->getMessage(); } $valueSet = self::rankFilterValues($valueSet); if ($order === self::RANK_SORT_DESCENDING) { rsort($valueSet, SORT_NUMERIC); } else { sort($valueSet, SORT_NUMERIC); } $pos = array_search($value, $valueSet); if ($pos === false) { return ExcelError::NA(); } return ++$pos; } protected static function percentileFilterValues(array $dataSet): array { return array_filter( $dataSet, function ($value): bool { return is_numeric($value) && !is_string($value); } ); } protected static function rankFilterValues(array $dataSet): array { return array_filter( $dataSet, function ($value): bool { return is_numeric($value); } ); } }