Loading...
Knightwalker avatar Knightwalker 38 Точки

03. Book Library | Objects and Classes | PHP

03. Books Library - https://judge.softuni.bg/Contests/Compete/Index/1222#2

По начина по който съм тръгнал ще стане следното

Tolkien -> 30.00
Tolkien -> 10.25
JKRowling -> 15.50
JKRowling -> 20.00
OBowden -> 14.00

Това, което ми трябва, е... (демек до тук просто съм си ги сложил в един лист но не знам как всичките книги на 1 автор да ги комбинирам). Гледах по форума, видях че на JS направо ги сортират и ги принтират, но това обезмисля тоя Class library дето е даден в заданието.

Tolkien -> 40.25
JKRowling -> 35.50
OBowden -> 14.00

Това което си представям че трябва да стане е речник от името на автора и total price от листа с неговите книги. Не мога да разбера със сетъри ли трябва да го направя и как точно става? Need help :D

<?php

class Library
{
  private $name;
  private $listOfBooks = [];

  public function __construct ($name, $listOfBooks)
  {
    $this->name = $name;
    $this->listOfBooks = $listOfBooks;
  }

}

class Book
{
  private $title;
  private $author;
  private $publisher;
  private $date;
  private $isbn;
  private $price;

  public function __construct ($title, $author, $publisher, $date, $isbn, $price)
  {
    $this->title = $title;
    $this->author = $author;
    $this->publisher = $publisher;
    $this->date = $date;
    $this->isbn = $isbn;
    $this->price = $price;
  }

  public function getAuthor()
  {
    return $this->author;
  }

  public function getPrice()
  {
    return $this->price;
  }

}

$n = readline();
$listOfBooks = [];

for ($i = 0; $i < $n; $i++) {
  $input = explode(" ", readline());
  $title = $input[0];
  $author = $input[1];
  $publisher = $input[2];
  $date = $input[3];
  $isbn = $input[4];
  $price = $input[5];

  $book = new Book($title, $author, $publisher, $date, $isbn, $price);
  $listOfBooks[] = $book;
}

var_dump($listOfBooks);

?>

 

Тагове:
0
Fundamentals Module
dimaldim92 avatar dimaldim92 149 Точки
Best Answer

Ето меото решение - 100/100, използвал съм накрая един "филтриран" array (assoc):

<?php
class Library {
    public $name;
    public $books;
    public function __construct($name = null, array $books = null) {
        $this->name = $name;
        if($books != null) {
        $this->$books = $books;
        }
    }
}
class Book {
    public $title;
    public $author;
    public $publisher;
    public $releaseDate;
    public $isbn;
    public $price;
    public function __construct($title = null, $author = null, $publisher = null, $releaseDate = null, $isbn = null, $price = null) {
        $this->title = $title;
        $this->author = $author;
        $this->publisher = $publisher;
        $this->releaseDate = $releaseDate;
        $this->isbn = $isbn;
        $this->price = $price;
    }
}
$n = intval(readline());
$books = [];
$library = new Library;
$library->books = array();
 for($i = 1; $i <= $n; $i++) {
     $input = explode(" ", readline());
     $title = $input[0];
     $author = $input[1];
     $publisher = $input[2];
     $releaseDate = $input[3];
     $isbn = $input[4];
     $price = $input[5];
     //Generate book
     $book = new Book();
     $book->title = $title;
     $book->author = $author;
     $book->publisher = $publisher;
     $book->releaseDate = $releaseDate;
     $book->isbn = $isbn;
     $book->price = $price;
     $library->books[] = $book;
 }
$filteredArr = [];
  foreach($library as $values) {
      if(is_array($values)) {
      foreach($values as $b) {
          if(!key_exists($b->author, $filteredArr)) {
              $filteredArr[$b->author] = 0;
          }
          $filteredArr[$b->author] += $b->price;
      }
      }
  }
  foreach($filteredArr as $n => $v) {
      $name[] = $n;
      $val[] = $v;
  }
  array_multisort($val, SORT_DESC, $name, SORT_ASC, $filteredArr);
  foreach($filteredArr as $author => $price) {
      printf("%s -> %.2f\n", $author, $price);
  }
?>

 

0
13/11/2018 20:21:19
Knightwalker avatar Knightwalker 38 Точки

Евала! Погледнах как си я написал и ми присветна, написах я по друг начин обаче, но ако не бях видял от теб щях да си цикля още. Оказа се че няма смисъл от Library клас и взех че си направих директно асоциативен масив. Оставям си кода ако някой се запъне да може да види и тоя начин.

<?php

class Book
{
  private $title;
  private $author;
  private $publisher;
  private $date;
  private $isbn;
  private $price;

  public function __construct ($title, $author, $publisher, $date, $isbn, $price)
  {
    $this->title = $title;
    $this->author = $author;
    $this->publisher = $publisher;
    $this->date = $date;
    $this->isbn = $isbn;
    $this->price = $price;
  }

  public function getAuthor()
  {
    return $this->author;
  }

  public function getPrice()
  {
    return $this->price;
  }

}

$n = readline();
$listOfBooks = [];
$libraryList = [];

for ($i = 0; $i < $n; $i++) {
  $input = explode(" ", readline());
  $title = $input[0];
  $author = $input[1];
  $publisher = $input[2];
  $date = $input[3];
  $isbn = $input[4];
  $price = $input[5];

  $book = new Book($title, $author, $publisher, $date, $isbn, $price);
  $listOfBooks[] = $book;
}

//var_dump($listOfBooks);

foreach ($listOfBooks as $value) {
  $author = $value->getAuthor();
  $price = $value->getPrice();

  if(!key_exists($author, $libraryList)) {
    $libraryList[$author] = 0;
  }
  $libraryList[$author] += $price; 
}

uksort($libraryList, function ($a, $b) use ($libraryList) { 
    if ($libraryList[$a] < $libraryList[$b]) return 1;
    elseif ($libraryList[$a] > $libraryList[$b]) return -1; 
    else return strcmp($a, $b); 
});

foreach ($libraryList as $key => $value) {
  echo $key . " -> " . number_format($value, 2, ".", "") . PHP_EOL;
}

//var_dump($libraryList);

?>

 

 

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.