Java týden Body zdarma
Využij podzimních slev a získej od nás až 40 % bodů zdarma! Více zde
Pouze tento týden sleva až 80 % na Java e-learning!

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

Aktivity (2)
Avatar
Robert Hájek:29. března 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. března 10:35
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:29. března 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. března 10:51
Avatar
Robert Hájek:29. března 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. března 10:56
Avatar
Odpovídá na Robert Hájek
Tomáš Novotný:29. března 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  ±0 29. března 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. března 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. března 10:58
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:29. března 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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět 29. března 10:59
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:29. března 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. března 11:03
 
Nahoru Odpovědět 29. března 11:02
Avatar
Robert Hájek:29. března 11:03

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

 
Nahoru Odpovědět 29. března 11:03
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Robert Hájek
Peter Mlich:29. března 11:03

Si na body nepotrpim, ale dik :)

 
Nahoru Odpovědět 29. března 11:03
Avatar
Robert Hájek:29. března 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. března 11:16
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
David Hynek
Redaktor
Avatar
Odpovídá na Robert Hájek
David Hynek:29. března 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  +2 29. března 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. března 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. března 12:27
Avatar
David Hynek
Redaktor
Avatar
Odpovídá na Robert Hájek
David Hynek:29. března 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  -1 29. března 14:28
Čím víc vím, tím víc věcí nevím.
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:29. března 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. března 15:37
 
Nahoru Odpovědět 29. března 15:35
Avatar
Robert Hájek:29. března 16:47

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

 
Nahoru Odpovědět 29. března 16:47
Avatar
David Hynek
Redaktor
Avatar
Odpovídá na Peter Mlich
David Hynek:29. března 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. března 18:48
Nahoru Odpovědět 29. března 18:46
Čím víc vím, tím víc věcí nevím.
Avatar
Odpovídá na Peter Mlich
Tomáš Novotný:30. března 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  +1 30. března 8:51
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar
Vladislav Ladicky:30. března 9:10

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

 
Nahoru Odpovědět 30. března 9:10
Avatar
Odpovídá na Tomáš Novotný
Tomáš Novotný:30. března 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. března 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. dubna 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. dubna 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.