Autor Zpráva
Rudloch
Profil *
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
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
$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 *
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 *
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
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 *
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ů...
    ?>

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0