Autor | Zpráva | ||
---|---|---|---|
Rudloch Profil * |
#1 · Zasláno: 27. 8. 2012, 05:48:37
Zdravím vespolek,
řeším takovou nestandartní věc. Potřeboval bych sečíst počet položek v poli, ale jen těch, které mají nějakou hodnotu. příklad: <?php $pole = array('fff','ddd','sss','',''); $pocet = count($pole); echo $pocet; // vypíše 5, ale hodnoty jsou jen 3 a potřeboval bych aby to vypsalo právě 3 ?> Poradí někdo jak to zkombinovat? Díky |
||
Chuchycek Profil |
#2 · Zasláno: 27. 8. 2012, 07:53:31
Ahoj,
a co třeba zkusit, projít pole a vložit podmínku? $pole = array('fff','ddd','sss','',''); $pocet = 0; foreach ($pole as $hodnota) { if($hodnota != ""){ $pocet++; } } echo $pocet; |
||
Spectator Profil |
#3 · Zasláno: 27. 8. 2012, 10:05:06
$pole = array('a', '', 'b', null, false, true, 1); echo count(array_filter($pole)) // >>> 4 |
||
Tori Profil |
array_filter bez callbacku nepočítá hodnoty, které by po přetypování na boolean byly FALSE, tedy FALSE, NULL, "", prázdné pole a bohužel i číslo 0.
$pocet = count(array_filter($pole));
Pokud máte jistotu, že hodnoty jsou jen řetězce nebo čísla, dá se použít $pocet = count(array_filter($pole, 'strlen')); .
Spolehlivá možnost je použít callback a určit, co se má počítat a co ne: // nepočítá prázdné řetězce a NULL function myFilter($value) { return !(is_null($value) || $value === ''); } $pocet = count(array_filter($pole, 'myFilter')); // pro PHP 5.3: $pocet = count(array_filter($pole, function($value) { return !(is_null($value) || $value === ''); })); PS: "nestandardní", standarta je něco jiného. |
||
Rudloch Profil * |
#5 · Zasláno: 27. 8. 2012, 15:15:05
Díky všem za pomoc, vyzkouším. To projítí pole mě taky mohlo napadnout, ale co bych už taky kolem 6 ráno chtěl řešit co? :) I když jak teď nad tím přemýšlím, tak s tím foreachem to asi nepůjde. Protože potřebuju zjistit rovnou to číslo, podle kterého se pak v jiný foreach ukončí. No vyzkouším a pak dám kdyžtak vědět jak sem dopadl... :) Jinak jde o textové řetězce, čísla tam nikdy nebudou...
|
||
Rudloch Profil * |
#6 · Zasláno: 27. 8. 2012, 18:33:59
Takže zjištění: array_filter bohatě postačuje.
No abych upřesnil o co jde. Jde v podstatě o vyhodnocení multiuploadu pro fotky. Mám předdefinovaný form, o 5 políčkách kde můžu uploadnout 1-5 fotek naráz. Odesláním formu se pošle pole, které obsahuje soupis jak vyplněných, tak i nevyplněných políček. Proto to pole i s prázdnými záznamy. Chtěl sem právě udělat aby to po zpracování libovolného počtu odeslaných souborů, po posledním cyklu přesměrovalo stránku na info o úspěšném uploadu. Což sem chtěl vyřešit právě tím, že zjistím kolik je odeslaných souborů a pak nechám počítat cykly. V poli nikdy nebudou čísla, takže bych se použití zmíněné funkce nebál. Funguje to podle očekávání, teda aspoň částečně. Ono je to celé postavené na Nette frameworku a ještě to dělá trošku problémy při uploadu velkých souborů. S tím mi tady ale asi moc nepomůžete co? :( |
||
Tori Profil |
Rudloch:
Jo takhle, tak to mi připadá foreach lepší. Co když vyplním první a třetí pole? Array_filter najde dvě vyplněné položky, ale neví, které to jsou, takže for ($i=0;$i<$pocet; ... se nedá použít.
Kdybyste tam měl jen <input type=file> , tak se dá tím array_filter vyhodit prázdné, ale pokud tam jsou i políčka pro popisky, tagy, atd., tak asi spíš ne.
|
||
Keeehi Profil |
#8 · Zasláno: 27. 8. 2012, 21:18:04
Tak to to děláš úplně zbytečně složitě.
Jako základ by šlo použít toto: foreach ( $_FILES['userfile']['tmp_name'] as $key => $tmpFile ) { if ( !empty($tmpFile) && file_exists($tmpFile) ) { move_uploaded_file($tmpFile, $_FILES['userfile']['tmp_name'][$key]); } } Za problémy s velkými soubory nejspíše Nette nemůže. Záleží to na nastavení. |
||
Rudloch Profil * |
#9 · Zasláno: 28. 8. 2012, 05:50:26
Tori popisky tam nejsou, jsou tam jen file inputy. A funguje to i když dám upnout, každý 2 input..
Keeehi: Složitě možná, ono je to složitější o moc víc... A jak sem psal, tak chci po posledním uplodu (průchodu foreach) přesměrovat stránku, aby nebylo možné po refreši odeslat znovu to samé... Pošlu tedy celý kód, pokud se v tom někdo vyzná... Je tam pár věcí navíc, které by tam nemusely být, protože o to se má starat nette, ale nějak se mu nechce. Např - omezení uploadu pouze na fotky, omezení velikosti souboru... <?php // nějaký kód před... //formulář protected function createComponentUploadForm() { $form = new Form(); $container = $form->addContainer('foto'); for ($i = 1; $i <= 5; $i++) { $container->addUpload('file' . $i, 'Soubor:'); // ->addRule(Form::MAX_FILE_SIZE, 'Maximální velikost souboru je 7,5 Mb.', 7500 * 1024 /* v bytech */); } $folder = $this->getParam('folder'); $form->addHidden('folder', $folder); $form->addSubmit('create', 'Nahrát'); $form->onSuccess[] = callback($this, 'uploadFormSubmitted'); return $form; } // upload... public function uploadFormSubmitted(Form $form) { $pole = $_FILES['foto']['name']; $count_array = count(array_filter($pole)); $cykle = 0; foreach ($_FILES["foto"]["error"] as $key => $error) { if (is_file($_FILES["foto"]["tmp_name"][$key])) { $cykle++; $file_type = array("image/jpeg", "image/png"); if (in_array($_FILES["foto"]["type"][$key], $file_type)) { $velikost = getimagesize($_FILES["foto"]["tmp_name"][$key]); $sirka = $velikost[0]; $rename_foto = $this->webalize($_FILES["foto"]["name"][$key]); // nastavení velikosti fotek a miniatur - získání údajů z DB $isExistSet = $this->model->getSetImg()->count('*'); if ($isExistSet >= 1) { foreach ($this->model->getSetImg() as $galImg) { $thumb = $galImg->thumbImg; $wiews = $galImg->wiewImg; } } else { // pokud v DB není nastaveno, použijí se výchozí hodnoty $thumb = 150; $wiews = 800; } // zjištění zda již galerii neexistuje fotka se stejným názvem $isExist = $this->model->getPhotos()->where(array('photo' => $rename_foto, 'folder' => $form->values->folder))->count('*'); if ($isExist == 0) { $this->model->getPhotos()->insert(array( 'photo' => $rename_foto, 'folder' => $form->values->folder )); // vytvoření miniatur a zmenšení fotek if ($sirka >= $wiews) { $image = Image::fromFile($_FILES["foto"]["tmp_name"][$key]); $image->resize($wiews, NULL); $image->sharpen(); $image->save(WWW_DIR . '/gallery/' . $form->values->folder . '/' . $rename_foto, 100); $imgThumb = WWW_DIR . '/gallery/' . $form->values->folder . '/' . $rename_foto; $image_thumb = Image::fromFile($imgThumb); $image_thumb->resize($thumb, NULL); $image_thumb->save(WWW_DIR . '/gallery/' . $form->values->folder . '/nahledy/' . $rename_foto, 100); } else { move_uploaded_file($_FILES["foto"]["tmp_name"][$key], './gallery/' . $form->values->folder . '/' . $rename_foto); $imgThumb = WWW_DIR . '/gallery/' . $form->values->folder . '/' . $rename_foto; $image_thumb = Image::fromFile($imgThumb); $image_thumb->resize($thumb, NULL); $image_thumb->save(WWW_DIR . '/gallery/' . $form->values->folder . '/nahledy/' . $rename_foto, 100); } $this->flashMessage('Fotografie "' . $_FILES["foto"]["name"][$key] . '" byla přidána.'); if ($count_array == $cykle) { $this->redirect('this', array('folder' => $form->values->folder)); } } else { $this->flashMessage('Fotografie "' . $_FILES["foto"]["name"][$key] . '" již v galerii existuje.'); if ($count_array == $cykle) { $this->redirect('this', array('folder' => $form->values->folder)); } } } else { $this->flashMessage('Nepodporovaný soubor ("' . $_FILES["foto"]["type"][$key] . '")! Podporovány jsou pouze obrázky jpg nebo png.'); if ($count_array == $cykle) { $this->redirect('this', array('folder' => $form->values->folder)); } } } } } // další část kódu pro změnu názvů... ?> |
||
Časová prodleva: 13 let
|
0