Shembuj të listës Php. Merrni ekstremet nga një listë numrash

  • Përkthimi

PHP 5.4 u publikua katër muaj më parë, kështu që ndoshta është shumë herët për të parë një version të ri të PHP. Megjithatë, unë do të doja t'i jap kujtdo që nuk është i abonuar në listën e brendshme të postimeve një pamje të vogël të asaj se si mund të duket PHP 5.5.

Sidoqoftë, është e rëndësishme të kuptohet: PHP 5.5 është ende në fazat e hershme të zhvillimit, kështu që askush nuk e di se si do të duket në fund. Gjithçka e shkruar këtu është vetëm sugjerime. Jam i sigurt se jo e gjithë kjo do të jetë në PHP 5.5, ose do të jetë, por jo në këtë formë.

Pra, mos u emociononi shumë.

Tani, pa vonesë, këtu është një listë e veçorive që janë duke u punuar në PHP 5.5:

përputhshmëria e prapambetur

Le të fillojmë me dy ndryshime që janë tashmë në master dhe ndikojnë në pajtueshmërinë e pasme (të paktën në një farë mase):
Heqja e mbështetjes për Windows XP dhe 2003
Statusi: i zbritur; Përgjegjës: Pierre Joye

PHP 5.5 nuk mbështet më Windows XP dhe 2003. Këto sisteme janë rreth dhjetë vjet të vjetra, kështu që PHP i ka braktisur.

Modifikuesi /e është zhvlerësuar

Karakteristika dhe klasa të reja

Më pas do të shohim disa nga veçoritë dhe klasat e reja të planifikuara:
boolval ()
Statusi: i zbritur; Përgjegjëse: Jille Timmermans

PHP tashmë zbaton funksionet strval, intval dhe floatval. U shtua funksioni boolval për qëndrueshmëri. Bën të njëjtën gjë si një cast (bool), por mund të përdoret si argument për një funksion tjetër.

hash_pbkdf2()
Statusi: i zbritur; Përgjegjës: Anthony Ferrara
Shtesa në zgjerimin intl
Statusi: i zbritur; Përgjegjës: Gustavo André dos Santos Lopes

Do të ketë shumë përmirësime në zgjerimin intl. Për shembull, do të ketë klasa të reja IntlCalendar, IntlGregorianCalendar, IntlTimeZone, IntlBreakIterator, IntlRuleBasedBreakIterator, IntlCodePointBreakIterator. Fatkeqësisht nuk di shumë për zgjerimin intl, kështu që nëse doni të mësoni më shumë, ju rekomandoj të shikoni njoftimet e listës së postimeve për Calendar dhe BreakIterator.

array_column()
Statusi: i propozuar; Përgjegjës: Ben Ramsey

Ndryshimet në gjuhë

Tani le të kalojmë te gjërat vërtet interesante: veçori të reja dhe përmirësime të gjuhës.
Çreferencimi i vargjeve
Statusi: i zbritur; Përgjegjës: Xinchen Hui

Çreferencimi i vargut do të thotë që operacionet e vargjeve mund të aplikohen në varg ose drejtpërdrejt në varg. Këtu janë dy shembuj:

Nuk mendoj se kjo veçori është shumë e dobishme në praktikë, por e bën gjuhën më të qëndrueshme. Shihni gjithashtu RFC.

vala() punon me thirrje funksioni dhe shprehje të tjera
Statusi: i zbritur; Përgjegjës: Nikita Popov

Aktualisht, konstrukti i gjuhës boshe() mund të përdoret vetëm me variabla, jo me shprehje. Për shembull, kodi bosh($this->getFriends()) do të shkaktojë një gabim. Në PHP 5.5 ky do të jetë kod i vlefshëm. Për më shumë informacion, shihni RFC.

Marrja e emrit të klasës plotësisht të kualifikuar
Statusi: i propozuar; Përgjegjës: Ralph Schindler

PHP 5.3 prezantoi hapësirat e emrave me aftësinë për të caktuar pseudonime më të shkurtra për klasat dhe hapësirat e emrave. Kjo nuk vlen për rreshtin e emrit të klasës:

Si zgjidhje, është propozuar një sintaksë e re, FooBar::class, e cila kthen emrin e plotë të klasës:

Më shumë shembuj në RFC.

Kapërcimi i parametrave
Statusi: i propozuar; Përgjegjës: Stas Malyshev

Nëse keni një funksion që merr parametra të shumtë opsionalë, aktualisht nuk ka asnjë mënyrë për të ndryshuar vetëm të fundit duke i lënë të gjithë të tjerët si parazgjedhje.

Funksioni create_query($where, $order_by, $join_type="", $execute = false, $report_errors = e vërtetë) (... )

Nuk ka asnjë mënyrë për të vendosur $report_errors = false pa përsëritur dy parazgjedhjet e tjera. Për të zgjidhur këtë problem, propozohet përdorimi i kapërcimit të parametrave:

Create_query("deleted=0", "emri", default, default, false);

Personalisht, nuk më pëlqen veçanërisht ky propozim. Sipas mendimit tim, kodi që kërkon këtë risi nuk është menduar mirë. Funksionet nuk duhet të kenë 12 parametra shtesë.

Kontrollimi i tipit për vlerat skalare
Statusi: i propozuar; Përgjegjës: Anthony Ferrara

Kontrolli i tipit për vlerat skalare ishte planifikuar fillimisht në 5.4, por nuk u zbatua për shkak të mungesës së konsensusit. Për më shumë informacion se pse nuk është bërë ende në PHP, shihni: Lëvizjet e tipit skalar janë më të vështira nga sa mendoni.

Në PHP 5.5 diskutimi ka rifilluar dhe mendoj se ka një propozim mjaft të mirë për të kontrolluar llojin e vlerave skalare duke përdorur konvertimet e tipit.

Do të funksionojë duke hedhur vlerën e hyrjes në llojin e specifikuar, por vetëm nëse transmetimi mund të ndodhë pa humbur të dhëna. Për shembull 123 , 123.0 , "123" do të jenë të vlefshme për parametrat int, por "hello world" jo. Kjo përputhet me sjelljen e funksioneve të brendshme.

Funksioni foo(int $i) ( ... ) foo(1); // $i = 1 foo (1.0); // $i = 1 foo ("1"); // $i = 1 foo ("1abc"); // ende jo e qartë, ndoshta $i = 1 me njoftimin e daljes foo(1.5); // ende jo e qartë, ndoshta $i = 1 me njoftimin e daljes foo(); // gabim foo ("abc"); // gabim

Marrës dhe vendosës
Statusi: i propozuar; Përgjegjës: Clint Priest

Nëse nuk jeni adhurues i shkrimit të të gjitha metodave getXYZ() dhe setXYZ($value), atëherë ky duhet të jetë një ndryshim pozitiv për ju. Klauzola shton sintaksë të re për të specifikuar se çfarë duhet të ndodhë kur një veti shkruhet ose lexohet:

sekonda/3600; ) set ( $this->sekonda = $value * 3600; ) ) ) $timePeriod = Periudha Kohe e re; $timePeriod->orë = 10; var_dump($timePeriod->sekonda); // int(36000) var_dump($timePeriod->orë); // int (10)
Ka disa veçori të reja, të tilla si vetitë vetëm për lexim. Nëse doni të dini më shumë, shikoni RFC.

Gjeneratorë

Iteratorët përdoren rrallë në ditët e sotme, sepse zbatimi i tyre kërkon shumë kod boilerplate. Gjeneruesit duhet ta zgjidhin këtë problem duke ofruar një mënyrë të thjeshtë për të krijuar përsëritës.

Për shembull, ja se si të përcaktoni funksionin e diapazonit si një përsëritës:

Funksioni i mësipërm xrange ka të njëjtën sjellje si funksioni i intervalit të integruar me një ndryshim: në vend që të kthejë një grup me të gjitha vlerat, ai kthen një përsëritës që gjeneron vlerat në fluturim.

Për një hyrje më të thelluar të temës, mund të shikoni RFC-në.

Lista e përzgjedhjes dhe shprehjeve gjeneruese
Statusi: i propozuar; Përgjegjës: Nikita Popov

Zgjedhjet e listave ofrojnë një mënyrë të thjeshtë për të kryer operacione në vargje:

$firstNames = ;

Kodi i mësipërm është i barabartë me sa vijon:

$firstNames = ; foreach ($users si $user) ( $firstNames = $user->firstName; )
Ju gjithashtu mund të filtroni vargje si kjo:

$UnderageUsers = ;

Shprehjet e gjeneratorit janë shumë të ngjashme, por në vend që të kthejnë një grup, ato kthejnë një përsëritës që gjeneron vlera në fluturim.

konkluzioni

Siç mund ta shihni, ka shumë gjëra të mahnitshme që po punohen në PHP 5.5. Por siç thashë, PHP 5.5 është ende i ri, kështu që ne nuk e dimë me siguri se çfarë do të jetë dhe çfarë nuk do të jetë në të.

Nëse dëshironi të qëndroni të përditësuar për mundësitë e reja ose dëshironi të ndihmoni në diskutim dhe/ose zhvillim, sigurohuni që ta bëni këtë

E imja duket si e jprofitt

por i ndava në maja dhe lugina që të mund të bëj më shumë me këtë.

Mendoj se cikli i tij është shumë më i pastër se i imi, por thjesht doja ta provoja vetë.
Mos me gjyko

Ky skenar thjesht shfaq pikat dhe zgjedh majat dhe luginat dhe u jep atyre respektivisht jeshile dhe të kuqe. Shikojeni këtë si një ndihmë vizuale. :P

$array[$i-1]; $more_than_next = $array[$i] > $array[$i+1]; $next_is_equal = $array[$i] == $array[$i+1]; if($next_is_equal) vazhdo; if($i == 0)( if($more_than_next)( $peaks = $array[$i]; $peak_keys = $i; )tjeter( $valleys = $array[$i]; $valley_keys = $i; ) )elseif($i == (count($array)-1))( if($more_than_last)( $peaks = $array[$i]; $peak_keys = $i; )else( $valleys = $array[ $i]; $valley_keys = $i; ( $valleys = $array[$i]; $valley_keys = $i; ) ) return array("peaks" => $peaks, "valleys" => $valleys, "peak_keys" => $peak_keys, "valley_keys" = > $valley_keys); ) ?> "; foreach($plot as $key => $point)( $majtas = ($key*10); $top = 400 - ($point*10); if(in_array($key, $res["peak_keys" ]) || në_array($key, $res["çelësat_valley"]))( $extreme = "

$pikë
"; )else( $extreme = ""; ) if(in_array($key, $res["peak_keys"]))($xc = "extr_high"; )elseif(in_array($key, $res["valley_keys" ]))( $xc = "extr_low"; )tjetër ( $xc = ""; ) jehonë "
$ekstreme
";) jehonë"
"; ?>
Lugina Maja
Më e ulëta
Më e larta

Unë nuk kam testuar shumë dhe kjo nuk do të funksionojë me asgjë më pak se 3 pikë, por duhet t'ju japë një pikënisje të mirë.

$curr && $curr< $array[$i + 1]) { $extremes = $curr; } //maxes else if ($last < $curr && $curr >$array[$i + 1]) ( $extremes = $curr; ) if($last != $curr && $curr != $array[$i + 1]) ( $last = $curr; ) ) // shtoni pikën e fundit $extremes = $array[$num - 1]; print_r($ekstreme);

Ju jep rezultatet (keni humbur disa në listën tuaj):

Vargu ( => 10 => 8 => 9 => 4 => 11 => 10 => 30 => 28 => 29 => 1)

Nëse dëshironi që të jetë saktësisht si lista, do t'ju duhet të aplikoni një zbutje të të dhënave ose disa toleranca zbulimi.

Një variant i testit të parë për të përcaktuar ekstremet lokale është identifikimi i pikave ku trekëndëshi alternon shenjën nga një interval në tjetrin. Këto pika do të jenë maksimale nëse delta shkon nga pozitive në negative dhe minimale nëse delta shkon nga negative në pozitive, por për përdorimin tuaj kjo nuk duket se ka rëndësi. Gjithashtu, hidhni në pikat fundore sepse intervali konsiderohet i hapur për këtë test dhe ju duket se dëshironi që ato të përfshihen.

Shënim. Kam testuar pak në ideone.com, funksionon, por mund të ketë probleme të pazbuluara. është e njëjta duhet punë për noton.

Kredia: Ky është testi i parë derivator nga çdo libër shkollor Calculus I, i përshtatur vetëm për llogaritje diskrete. Ne e konsiderojmë çdo pikë si një pikë kritike sepse nuk e dimë funksionin për grafikun.

Redakto: Pasi shikoni grafikun e të dhënave të tungstenit, mendoj se ndoshta po kërkoni vetëm nivelin e lartë dhe të ulët global në intervalin e mbyllur, plus pikat përfundimtare? Nëse po, thjesht përdorni diçka të thjeshtë si max($points) dhe min($points) .

Edit: Unë kurrë nuk kam pasur një mundësi të mirë për të përdorur xor më parë!

po, për çdo numër në rresht e krahason me numrat anësor dhe e ke marrë (ky numër është më i vogël se numri para dhe pas). Pastaj shtoni numrat e parë dhe të fundit dhe ky është një numër i plotë.

Unë pres që të jetë një grup i renditur.

Këtu është pseudokodi për këtë

hyrje: listOfNumbers

//Trajto raste të jashtëzakonshme nëse listOfNumbers.length == 0 kthim nëse listOfNumbers.length == 1 kthim //Kushti paraprak listOfNumbers.length > 1 ekstreme = boshLista e funditNumber = listOfNumbers është në rritje = listOfNumbers< listOfNumbers extremes.push(listOfNumbers) foreach number in listOfNumbers if(isIncreasing AND lastNumber >numri) ekstreme.push(numri i fundit) ështëRritja = false nëse (NUK është në rritje DHE numri i fundit< number) extremes.push(lastNumber) isIncreasing = true extremes.push(listOfNumbers.length-1) return extremes

Unë mendoj se kjo do të bëhet, megjithëse nuk e kam testuar.

Merrni numrin e parë dhe të fundit nga një grup numrash, më pas renditni grupin dhe merrni numrin e parë dhe të fundit që janë të ndryshëm nga rezultati juaj i fundit. Dhe do të keni një rezultat si shembulli juaj.



Ju pëlqeu artikulli? Ndani me miqtë tuaj!