| 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