Ocena programu [skrypt php]

0

Tutaj mam kod programu, który był napisany w celu sprawdzenia dostanie się do pracy, ale nie przeszedł mogibyście ocenić ten program dlaczego mógł nie przejść.

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="pl" xml:lang="pl">
<head>
	<title>Test PHP - Zadanie 2</title>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<link type="text/css" rel="stylesheet" href="../res/style.css"/>
</head>
<body>
<div class="wrap">
<?php 
	$taskNum = 2;
	include __DIR__ . '/../res/nav.php';
	include __DIR__ . '/../res/tasks/'.$taskNum.'.php';
?>
</div>
<div class="solution">
<?php 
#
# zadane tablice imion i nazwisk (NIE MODYFIKOWAĆ)
#
$imionaZenskie = array('agnieszka','Klaudia','anna','Zuzanna','maria','Iza','Julia','Natalia');
$imionaMeskie = array('Konrad','mariusz','Filip','Marcin','Daniel','Marian','Adam','Rafał');
$nazwiska = array('Nowak','Kowalska','Wójcik','wiśniewski','Dąbrowski','Dudek','Kamiński','kowalczyk');

/** Obszar roboczy - miejsce na implementację rozwiązania zadania
 ************************************************************************
 * BEGIN >>
 ************************************************************************/
$profil = array();
$i = 0;
$bool = false;
while ($i <3) {
  $imie_zen = rand(0,7);
  $imie_zen2 = $imionaZenskie[$imie_zen];
  //$liczba = rand(0,count($nazwiska) );
  while ($bool  == false) {
    $rand = rand(0,7);
    //$rand =1;
    
    //$liczba = rand(0,count($nazwiska) );
    $result = sprawdz_nazwiska_z($nazwiska[$rand]);
    if ($result != false) $bool = true;
  }
  //sprawdz_nazwiska_z($imiona_z,$nazwiska);
  
  $profil[$i][0] = "kobieta";
  $profil[$i][1] = $result;
  $profil[$i][2] = $imie_zen2;
  $bool = false;
  $i++;
}

$bool = false;
while ($i <6) {
  $imie_mes = rand(0,7);
  $imie_mes2 = $imionaMeskie[$imie_zen];
  //$liczba = rand(0,count($nazwiska) );
  while ($bool  == false) {
    $rand = rand(0,7);
    //$rand =1;
    
    //$liczba = rand(0,count($nazwiska) );
    $result = sprawdz_nazwiska_m($nazwiska[$rand]);
    if ($result != false) $bool = true;
  }
  //sprawdz_nazwiska_z($imiona_z,$nazwiska);
  
  $profil[$i][0] = "mężczyzna";
  $profil[$i][1] = $result;
  $profil[$i][2] = $imie_mes2;
  $bool = false;
  $i++;
}
//w tej tablicy są profile
var_dump($profil);

function sprawdz_nazwiska_z($nazwiska) {
  $str_count = strlen($nazwiska);
  if ($nazwiska[$str_count-1] == "i") return false;
  else return $nazwiska;
  
}

function sprawdz_nazwiska_m($nazwiska) {
  $str_count = strlen($nazwiska);
  if ($nazwiska[$str_count-1] == "a") return false;
  else return $nazwiska;
  
  
}

/************************************************************************
 * << END
 ************************************************************************/
?>
</div>
<?php include __DIR__ . '/../res/footer.php'; ?>
</body>
</html>
0

a treść zadania??

0

Napisz funkcję/skrypt/klasę PHP generującą profile użytkowników w zadanej ilości. Profil składa się z imienia, nazwiska i płci użytkownika. W tablicach poniżej znajdują się imiona i nazwiska, spośród których losowane mają być profile. Weź pod uwagę to, że określone imiona pasują tylko do określonych nazwisk. Wygeneruj kilka przykładów unikalnych profili. Skrypt powinien działać poprawnie w wersji PHP 5.4.

1

Tak się dziś nie pisze w PHP :-)

0

Podaj treść zadania - to bardziej pomogę.

  1. Przede wszystkim mieszasz html i php.
  2. Zbędne komentarze
  3. Polskie nazwy zmiennych i funkcji.
  4. Kiepsko sformatowany kod (wcięcia w htmlu, php)
  5. Może to nie wada - ale osobiscie napisałbym to obiektowo
  6. Słabe nazewnictwo funkcji - sprawdz_nazwiska_m - zakładam że mężczyzn.
  7. Brak klamerek w instrukcjach php (nawet jak jest jedna instrukcja to lepiej dać niż nie dać :p )

Byłoby więcej pewnie uwag, gdybym to wrzucił do IDE

0
  1. nie podoba mi się formatowanie, ale to kwestia gustu
  2. nie podoba mi się taka konstrukcja
if ($nazwiska[$str_count-1] == "i") return false;
  else return $nazwiska;

mieszanie typów zwracanych przez funkcję.

poza tym ostatni znak z ciągu to substr($nazwiska, -1)
dalej nazwa zmiennej $nazwiska a zawiera tak naprawdę JEDNO nazwisko

  1. cała ta pętla
while ($bool  == false) {
    $rand = rand(0,7);
    //$rand =1;
 
    //$liczba = rand(0,count($nazwiska) );
    $result = sprawdz_nazwiska_m($nazwiska[$rand]);
    if ($result != false) $bool = true;
  }

powinna być zamieniona na do while bez dodatkowych zmiennych

  1. if ($result != false) $bool = true; to to dla mnie jakiś potworek. Być może zapisanie tego jako $bool = $result coś zepsuje, ale tak jest dziwnie.
  2. nie lubię warunków w stylu if ($result != false) - if (!$result)

itd., itp.

Wg mnie po Twoim kodzie widać, że masz jakieś podstawy, umiesz rozwiązywać zadania ale robisz to bardzo nieefektywnie.

0

Mniej więcej do tej sprawy można podejść tak jak poniżej. Wszystkie pliki w jednym katalogu projektu.

Szablon base.php:

 <html lang="pl">
    <head>
        <title><?php if (isset($title)) echo $title; ?></title>
        <meta charset="utf-8" />
    </head>
    <body>
        <?php if (isset($content)) echo $content; ?>
    </body>
</html>

Szablon content.php:

 <pre>
<?php print_r($profiles); ?>
</pre>

Plik zawierający predefiniowane dane data.php:

<?php

return array(
    'man_names' => array('Konrad','Mariusz','Filip','Marcin','Daniel','Marian','Adam','Rafał'),
    'woman_names' => array('Agnieszka','Klaudia','Anna','Zuzanna','Maria','Iza','Julia','Natalia'),
    'surnames' => array('Nowak','Kowalska','Wójcik','wiśniewski','Dąbrowski','Dudek','Kamiński','kowalczyk')
); 

Klasa helper, View.php

<?php

define('DOCROOT', realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR);

class View
{
    private $_file;
    private $_data;

    public static function factory($file, array $data)
    {
        return new View($file, $data);
    }

    public function __construct($file, array $data)
    {
        $this->_file = DOCROOT . $file . '.php';
        $this->_data = $data;
    }

    public function render()
    {
        extract($this->_data);
        ob_start();
        include $this->_file;
        return ob_get_clean();
    }

    public function __toString()
    {
        return $this->render();
    }

} 

Główna część, helper Generator.php

<?php

class Generator
{
    private $_data;
    private $_output;
    private $_number = 3;

    public static function factory(array $data, $number = 3)
    {
        return new Generator($data, $number);
    }

    public function __construct(array $data, $number = 3)
    {
        $this->_data = $data;
        $this->_number = $number;
        $this->_output = (object) array(
            'data' => array(),
            'time' => 0
            );
    }

    public function execute()
    {
        $start = microtime(TRUE);

        // generate females
        $i = 0;
        $done = FALSE;

        while ($i < $this->_number)
        {
           $index = rand(0, 7);
           $name = $this->_data['woman_names'][$index];

           while ($done  == FALSE)
           {
               $rand = rand(0, 7);
               $result = $this->_check($this->_data['surnames'][$rand], 'f');
               if ($result != FALSE)
               {
                   $done = TRUE;
               }
            }

            $model = new stdClass;
            $model->name = $name;
            $model->surname = $result;
            $model->gender = 'Female';

            $this->_output->data[] = $model;

            $done = FALSE;
            $i++;
        }

        // generate males
        $done = FALSE;

        while ($i < ($this->_number * 2))
        {
           $index = rand(0, 7);
           $name = $this->_data['man_names'][$index];

           while ($done  == FALSE)
           {
               $rand = rand(0, 7);
               $result = $this->_check($this->_data['surnames'][$rand], 'm');
               if ($result != FALSE)
               {
                   $done = TRUE;
               }
            }

            $model = new stdClass;
            $model->name = $name;
            $model->surname = $result;
            $model->gender = 'Male';

            $this->_output->data[] = $model;

            $done = FALSE;
            $i++;
        }

        $end = microtime(TRUE);

        $this->_output->time = ($end - $start);

        return $this->_output;
    }

    private function _check($name, $sex = 'm')
    {
        $end_char = ($sex === 'm') ? 'i' : 'a';
        $len = strlen($name);
        return ($name[$len - 1] === $end_char) ? $name : FALSE;
    }

} 

I w końcu index.php:

<?php

spl_autoload_extensions('.php');
spl_autoload_register();

$data = include('data.php');
$number = 3;

$profiles = Generator::factory($data, $number)
            ->execute();

$title = 'Generator profili';
$content = View::factory('content', compact('profiles'));
$base    = View::factory('base',    compact('title', 'content'));

echo $base; 

Stawiam w dużej części przypadków że w celu "sprawdzenia" będzie to raczej na zasadzie podoba się / nie podoba się a nie w kontekście faktycznych umiejętności. No i oczywiście nawet tutaj zawsze można się przyczepić do czegokolwiek :-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1