quenerapu

Reordena las películas

Jan 18th, 2025 (edited)
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 4.71 KB | None | 0 0
  1. <?php
  2. /*
  3.  
  4.   El presente script lee un archivo JSON previamente creado con un formato similar a este:
  5.  
  6. [
  7.   {
  8.     "ref":"",
  9.     "title":"",
  10.     "year":"",
  11.     "directed-by":"",
  12.     "minutes":"",
  13.     "filmaffinity":""
  14.   },
  15.  
  16. (...)
  17. ]
  18.  
  19.   El único campo IMPRESCINDIBLE para que se pueda ejecutar este script es "minutes".
  20.   No obstante, los demás (y otros, ahí al gusto de cada uno) permiten hacer más rica
  21.   la ficha de cada película. El campo "ref" (que debe ser único) fue creado con la
  22.   intención de enlazar la imagen del cartel de cada película o una ficha con url propia
  23.   para cada película.
  24.  
  25.   Para https://inakiquenerapu.com/365pelis:
  26.     el JSON inicial fue este:
  27.     https://inakiquenerapu.com/365pelis/laspelis.json
  28.     el JSON resultante fue este:
  29.     https://inakiquenerapu.com/365pelis/360pelis.json
  30.  
  31. */
  32.  
  33.   $year = 2025;
  34.   $jsonFileName = "laspelis.json";
  35.  
  36. # Días festivos
  37.  $spareDays = [
  38.     "2025-01-01",
  39.     "2025-01-06",
  40.     "2025-04-17",
  41.     "2025-04-18",
  42.     "2025-05-01",
  43.     "2025-05-17",
  44.     "2025-05-29",
  45.     "2025-07-25",
  46.     "2025-08-15",
  47.     "2025-08-16",
  48.     "2025-11-01",
  49.     "2025-12-06",
  50.     "2025-12-08",
  51.     "2025-12-25",
  52.     ];
  53.  
  54.   $numberOfDays = ($year % 4 === 0 && $year % 100 !== 0) || $year % 400 === 0 ? 366 : 365;
  55.   $firstDay = new DateTime("$year-01-01");
  56.   $firstSaturday = 7 - $firstDay->format('N');
  57.   $days = range(1,$numberOfDays);
  58.   array_unshift($days,""); unset($days[0]); # Prefiero que este array comience en 1
  59.  
  60. # Sábados y domingos son días en los
  61. # que puedo ver películas más largas
  62.  for ($i = $firstSaturday; $i < count($days); $i += 7) :
  63.     $weekends[$i] = $i;
  64.     $weekends[$i+1] = $i+1;
  65.   endfor;
  66.  
  67. # Los días que indiqué como festivos son días en
  68. # los que también puedo ver películas más largas
  69.  $spareDays = array_map(function($item) {
  70.     return date("z", strtotime($item)) + 1;
  71.   }, $spareDays);
  72.   $spareDays = array_combine($spareDays,$spareDays);
  73.  
  74. # $spareDays pasa a ser el array con los números
  75. # de los días en los que dispongo de más tiempo
  76.  $spareDays = $weekends + $spareDays;
  77.   $spareDaysNumber = count($spareDays);
  78.  
  79. # Y $workingDays será el array con los números de los días
  80. # que no son $spareDays, es decir, días con menos tiempo
  81.  foreach($days as $k=>$v) :
  82.     if(!in_array($v,$spareDays)) : $workingDays[] = $v; endif;
  83.   endforeach;
  84.   $workingDaysNumber = count($workingDays);
  85.  
  86. # Desordeno tanto los $spareDays como los $workingDays
  87.  shuffle($spareDays);
  88.   shuffle($workingDays);
  89.  
  90. # Convierto el JSON con las 365 películas en el array
  91. # $theMovies y las ordeno de más largas a más cortas
  92.  $jsonString = file_get_contents($jsonFileName);
  93.   $theMovies = json_decode($jsonString, true);
  94.   if (json_last_error() !== JSON_ERROR_NONE) :
  95.     die("JSON decoding error: " . json_last_error_msg() . "\n");
  96.   endif;
  97.   array_multisort(array_column($theMovies, 'minutes'), SORT_DESC, $theMovies);
  98.  
  99. # Divido $theMovies en dos mitades para poder
  100. # asignar las películas más largas ($longMovies) a $spareDays
  101. # y las menos largas ($notSoLongMovies) a $workingDays
  102.  $longMovies = array_slice($theMovies, 0, $spareDaysNumber);
  103.   $notSoLongMovies = array_slice($theMovies, $spareDaysNumber);
  104.  
  105. # Añado dos nuevos elementos en cada ítem de cada array:
  106. # El día del año que le toca, la fecha (en formato legible por humanos)
  107.  foreach($longMovies as $k=>$v):
  108.     $longMovies[$k]["when"] = $spareDays[$k];
  109.     $dateTime = DateTime::createFromFormat('Y z', "$year ".($spareDays[$k]-1)."");
  110.     $longMovies[$k]["whenForHumans"] = ucfirst(IntlDateFormatter::formatObject($dateTime, "EEEE d 'de' MMMM", "es"));
  111.   endforeach;
  112.   foreach($notSoLongMovies as $k=>$v):
  113.     $notSoLongMovies[$k]["when"] = $workingDays[$k];
  114.     $dateTime = DateTime::createFromFormat('Y z', "$year ".($workingDays[$k]-1)."");
  115.     $notSoLongMovies[$k]["whenForHumans"] = ucfirst(IntlDateFormatter::formatObject($dateTime, "EEEE d 'de' MMMM", "es"));
  116.   endforeach;
  117.  
  118. # Reseteamos el array $days para que ahora contenga todas las películas:
  119. # $longMovies y $notSoLongMovies y las ordenamos por día del año.
  120. # Ya que estamos, añadimos a cada item del array $days dos nuevos elementos:
  121. # Si la he visto ya y si he publicado una crítica (ambas con valor false)
  122.  $days = array_merge($longMovies, $notSoLongMovies);
  123.   array_multisort(array_column($days, 'when'), SORT_ASC, $days);
  124.   foreach($days as $k=>$v):
  125.     $days[$k]["seen"] = "false";
  126.     $days[$k]["review"] = "false";
  127.   endforeach;
  128.  
  129. # Convertimos el array $days a JSON y lo presentamos en pantalla.
  130. # Listo para guardarlo como archivo .json con el nombre que queramos.
  131.  echo "<pre>".json_encode($days, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT | FILE_APPEND | LOCK_EX)."</pre>";
  132. ?>
Advertisement
Add Comment
Please, Sign In to add comment