Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Odstranění části proměnné

Aktivity
Avatar
Robert Hájek:29.3.2019 10:35

Mám konkrétní řadu hodnot v promněnné oddělené čárkou. (Jde o hodnoty z hodnocení 1-5 hvězdiček)
$rating = "2,5,3,4,4,2,­1,1,1,5,5";
Dostávám je ven není problém
$ratings = explode(", ", $rating);

Co já ale chci udělat je odebrat jednu konkrétní hodnotu. Vím jak odebrat všechny hodnoty třeba 1. Jenže to nechci jak vidíte jsou tam tři hodnoty 1 a já chci odebrat jen jednu hodnotu 1 a ne všechny tři.
Jak na to?

Zkusil jsem: Nenapadá mě jak to udělat...

Chci docílit: V podstatě se snažím odebrat jedno konkrétní hodnocení z mnoha.

Poradíte? Děkuji

 
Odpovědět
29.3.2019 10:35
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:29.3.2019 10:51

explode + unset
str_replace/preg_re­place, explode
explode + cyklus + unset

foreach ($arr as $key=>$value) {if ($value=='3') {unset($arr[$key]); break;}}

Nebo mozna nejakou funkci z manualu. Hledal jsi tam vubec? :) Nebo aspon googlem?
php.net/array nebo
https://www.php.net/…ok.array.php
http://cz.php.net/book.array.php
http://cz.php.net/…ef.array.php
Tragedka, nemel kdo prelozit. Ale vim, ze nejaky starsi manual mel i ceske preklady.

 
Nahoru Odpovědět
29.3.2019 10:51
Avatar
Robert Hájek:29.3.2019 10:56

Díky já to zkusím. Ne nehledal jsem. Jsem v časové tísni a poprvé po dlouhé době využívám mozek větší než ten můj. Díky za pomoc moc si toho vážím.

 
Nahoru Odpovědět
29.3.2019 10:56
Avatar
Odpovídá na Robert Hájek
Tomáš Novotný:29.3.2019 10:56

Ahoj, otázkou je jaká kritéria pro hodnocení "co odebrat" chceš použít. Pokud chceš odebrat třeba první 1čku lze použít...

$new_rating = preg_replace('1,', '', $rating, 1);
Nahoru Odpovědět
29.3.2019 10:56
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar
Robert Hájek:29.3.2019 10:58

Tomáši to vypadá opravdu jednoduše. Díky moc!
Je mi opravdu jedno, kterou jedničku odebrat, čili tohle řešení je moc prima díky.

 
Nahoru Odpovědět
29.3.2019 10:58
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:29.3.2019 10:59
php.net/str_replace
$str = "2,5,3,4,4,2,1,1,1,5,5";
$str = str_replace(array('3,', ',3'), array('', ''), $str, 1);
$arr = explode(',' , $str);
// ---
php.net/preg_replace
$str = "2,5,3,4,4,2,1,1,1,5,5";
$str = preg_replace('~,?3,?~', '', $str, 1);
$arr = explode(',' , $str);
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
29.3.2019 10:59
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:29.3.2019 11:02

'nehledal jsem. Jsem v časové tísni ' - u nas v praci se tomu rika vymluvy a nedava se za to zadny bonus na vyplatu :) zvlast proto, ze pri hledani mas reseni do 5 min, na forku do 14 dni. Kdyz jde zrovna o jednoduchou vec

Editováno 29.3.2019 11:03
 
Nahoru Odpovědět
29.3.2019 11:02
Avatar
Robert Hájek:29.3.2019 11:03

Ano je to výmluva, ale moc dobrá! Stejně si byl tak hodný a pomohl jsi mi.

 
Nahoru Odpovědět
29.3.2019 11:03
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Robert Hájek
Peter Mlich:29.3.2019 11:03

Si na body nepotrpim, ale dik :)

 
Nahoru Odpovědět
29.3.2019 11:03
Avatar
Robert Hájek:29.3.2019 11:16

Líbilo se mi v tom tvém řešení, že jsi myslel i na to, že ta hodnota, kterou se snažím vymazat bude vůbec ta první nejen ta ve středu nebo na konci řetězce. Je to tedy univerzální přesně pro to co potřebuji.

 
Nahoru Odpovědět
29.3.2019 11:16
Avatar
David Hynek
Tvůrce
Avatar
Odpovídá na Robert Hájek
David Hynek:29.3.2019 11:31

Tohle mi nedá.

Takže při cca 1000 hodnocení 1-5 budeš mít řetězec dlouhý 2000 znaků?

Předpokládám, že udělené hodnoty nijak nepáruješ, třeba k IP adrese, času a datum udělení.

Ty udělené hodnoty, ukládáš do souboru? Na podobné věci je skvělé SQLite, mohl bys pak mít pole třeba: {3,2,1,2,2}, (pořadí určuje známku hodnocení), v momentě, kdy budeš mít třeba těch 1000 hodnocení, bude to hned veselejší, př. {250,350,180,­150,70}.

Nahoru Odpovědět
29.3.2019 11:31
Čím víc vím, tím víc věcí nevím.
Avatar
Odpovídá na Peter Mlich
Robert Hájek:29.3.2019 12:27

No máš pravdu. Na to jsem nemyslel

@Peter
to tvoje řešení, které se mi tak líbilo mi hází chybu (týká se druhé řádky)
$str = "2,5,3,4,4,2,­1,1,1,5,5";
$str = str_replace(a­rray('3,', ',3'), array('', ''), $str, 1);
$arr = explode(',' , $str);

PHP: Only variables should be passed by reference

 
Nahoru Odpovědět
29.3.2019 12:27
Avatar
David Hynek
Tvůrce
Avatar
Odpovídá na Robert Hájek
David Hynek:29.3.2019 14:28

Jestli trváš na zachování řetězce pak zkus tohle:

$str = "2,5,3,4,4,4,2,1,1,1,5,5";
$str = preg_replace("/(1,)/i", "", $str,1);

Smaže to první jedničku, kterou potká.

Nahoru Odpovědět
29.3.2019 14:28
Čím víc vím, tím víc věcí nevím.
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:29.3.2019 15:35

http://php.net/str_replace
Tak si to podle prikladu sprav? :)
Ja netvrdil, ze jsem to testoval. Pouze napsal, jakym asi zpusobem to pouzit. Co se ti nelibi na cyklu z prvni odpovedi?

Example #1 Basic str_replace() examples
// Provides: Hll Wrld f PHP
$vowels = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U");
$onlyconsonants = str_replace($vowels, "", "Hello World of PHP");

,3 odpovida i ,33
3, odpovida i 13,

a co kdyz vstupni string bude '3' ?
S tim preg replace nastane podobny problem, tam jsem to tez nedomyslel.

preg_replace('~^3()$|^3,()|,3$()|,3(,)~', '$1', $str, 1); // zacatek 3 konec | zacatek 3 carka | carka 3 konec | carka 3 carka // a vyraz v zavorce se objevi v $1, coz je nutne pro posledni pripad, zachovat carku

Mozna by to slo napsat i jednoduseji, ale nechce se mi v patek premyslet :)

Hynkovo reseni trpi podobnymi nedostatky. Co nechapu, proc tam ma 'i'? 'i' znamena nerozlisuj velikost pismen. Pokud tam neco dat pro univerzalnost, tak spis neco jako gm. Ale jestli si to nepletu s js regularnimi vyrazy..

Editováno 29.3.2019 15:37
 
Nahoru Odpovědět
29.3.2019 15:35
Avatar
Robert Hájek:29.3.2019 16:47

Díky moc chlapi. Odsud už to zvládnu.

 
Nahoru Odpovědět
29.3.2019 16:47
Avatar
David Hynek
Tvůrce
Avatar
Odpovídá na Peter Mlich
David Hynek:29.3.2019 18:46

i je setrvacnost, jinak to funguje bez chyby. Vzdy zkousim to co sem davam.

Jinak, cislo na zacatku i v prubehu bude n, kdyz bude na konci, bude tak max jednou, tedy ho nema cenu mazat.

Editováno 29.3.2019 18:48
Nahoru Odpovědět
29.3.2019 18:46
Čím víc vím, tím víc věcí nevím.
Avatar
Odpovídá na Peter Mlich
Tomáš Novotný:30.3.2019 8:51

Přijde mi, že ses do toho zamotal Peter Mlich a vyrábíš řešení na problém který není.
V zadání je psáno, že hodnoty jsou z intervalu 1-5, takže 33, 13 ve stringu nejsou. V cíli je napsáno, že chce odebrat jednu hodnotou z mnoha ... (myslel jsem, že ze shodných, na základě předchozího kontextu)
ale dobrá, obecně jakékoliv jedno hodnocení a kdekoliv třeba takto

$new_rating = preg_replace('/1/', '', $rating, 1);

pokud by mu vadilo, že někde zůstanou oddělovače bez hodnot...

$purged_rating = preg_replace('/^,|,,|,$/', '', $new_rating);

nebo lze tyto dva zkombinovat do jednoho, případně obdobně použít str_replace...
Za zvážení rozhodně stojí příspěvek David Hynek s "nasčítaným hodnocením".

Nahoru Odpovědět
30.3.2019 8:51
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar

Člen
Avatar
:30.3.2019 9:10

Prečo chceš odstrániť to jedno hodnotenie? Na základe akého kľúča? Či logiky?

 
Nahoru Odpovědět
30.3.2019 9:10
Avatar
Odpovídá na Tomáš Novotný
Tomáš Novotný:30.3.2019 15:11

Ej, tak ještě jedna drobná nepřesnost ... ",," je samo potřeba nahrazovat "," ... ale tak věřím, že chápete kolegové

Nahoru Odpovědět
30.3.2019 15:11
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Tomáš Novotný
Peter Mlich:1.4.2019 9:47

My to chapeme, ale on asi nepochopi :) Proto jsem tam daval tolik zavorek do toho preg_replace. Jakoze by bylo lepsi napsat cely vzorec, pro jistotu. A mozna by bylo prehlednejsi to vlozit ty moznosti spis do str_replace.
Stejne si myslim, ze uplne nej je ten cyklus, co jsem napsal na zacatku. Explode vyresi carky a pak uz jen hledas a unsetnes.

 
Nahoru Odpovědět
1.4.2019 9:47
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 20 zpráv z 20.