PHP Liste - Json nur bestimmte einlesen und Randomfunktion ??


klausi89

Erfahrenes Mitglied
Hallo ich habe mal wieder eine Frage,

erstmal wäre ich dankbar wenn mal jemand über meinen bestehenden Code drüber schauen könnte ob dies so richtig ist.

Und zwar liegt meine json in folgendem Format vor ->

JSON:
{"status":200,"message":"Success","sites":[{"id":null,"siteName":"Webseite 1","owner":"clickworx","activeSince":"2019-04-27","reward":"0.001","abilityToPay":"Good","timeFrame":"50","users":"585","totalPaid":"11.987","currency":"USD","link":"http:\/\/www.webseite1.com","siteId":"10"},
                                           {"id":null,"siteName":"Webseite 2","owner":"pay gmbh","activeSince":"2019-04-27","reward":"0.002","abilityToPay":"Critical","timeFrame":"86400","users":"78","totalPaid":"0.368","currency":"EUR","link":"https:\/\/webseite2.de","siteId":"11"},
                                           usw.,
Jetzt frage ich die json ab und speichere die Daten in eine Tabelle

Code:
<?php


$json_file = "linklist/cache/list.json";
$file_contents = file_get_contents($json_file) or exit($html_header."<p>Error: Can't open the profile file.</p>");
$array = json_decode($file_contents,true);
$linklist = $array['sites'];

?>

<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="initial-scale=1.0, maximum-scale=2.0">
    
   <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
   <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.20/css/jquery.dataTables.min.css">
  
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Arimo+Web">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
    <style>
        body {
            font-family: 'Arimo Web', sans-serif;
            text-align: center;
        }
    </style>

</head>

<body>

 <table id="example" class="display table table-striped table-bordered table-hover table-responsive mb-3 order-column text-center" width="100%">
      <thead>
          <tr>
              <th class="text-warning text-left">Seite</th>
              <th class="text-warning">Währung</th>
              <th class="text-warning">Seite besuchen</th>
          </tr>
      </thead>
      <tbody>
      <?php

          foreach($linklist as $tablelinks) {
              echo '<tr>';
              echo '<td class="col-sm-4 text-center">' . $tablelinks['siteName'] . '</td>';    // Name
              echo '<td class="col-sm-2">' . $tablelinks['currency'] . '</td>';    // Währung
              echo '<td class="col-sm-2"><a class="btn btn-info hover-effect py-1" onclick="window.open(&quot;' .$tablelinks['link'].'&quot;);" href="javascript:void(0);" rel="nofollow noopener">Seite besuchen <i class="fa fa-external-link"></i></a></td>';
              echo '</tr>';
             }


      ?>
     </tbody>
  </table>
 
  <script type="text/javascript" language="javascript" src="https://code.jquery.com/jquery-3.3.1.js"></script>
  <script type="text/javascript" language="javascript" src="https://cdn.datatables.net/1.10.20/js/jquery.dataTables.min.js"></script>

<script>

$('#example').DataTable( {
    "processing": true,
    "paging":   true,
    "info":     false,
    "ordering": false,
    "searching": false,
    "pagingType": "simple"
} );
</script>

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"></script>

</body>
</html>

Das klappt soweit ganz gut.

Nun möchte ich aber gerne nur Seiten einlesen die als Währung 'EUR' verwenden.

Außerdem würde ich gerne dann von dieser 'EUR' Liste nur 3 Links per Random einlesen, also das nur 3 Links angezeigt werden aber eben immer per Random aus der erstellten Liste bzw. arrays (nur EUR) ausgelesen wird.

Leider weiß ich da gerade nicht so richtig wo ich das ansetzen soll. Vielleicht würde mir mal jemand helfen das wäre nett.

Grüße vorab
 

Sempervivum

Erfahrenes Mitglied
Ich würde so vorgehen:
1. Mit array_filter() nur die Einträge heraus filtern, die als Währung Euro haben.
2. Mit shuffle() das resultierende Array mischen, d. h. eine zufällige Reihenfolge erzeugen.
3. Die ersten drei Einträge auslesen und anzeigen.
 

klausi89

Erfahrenes Mitglied
Hmmm....na so dachte ich mir das auch :) aber eben mit der umsetzung in php hab ich da die Probleme...
Wie genau greife ich denn auf die gewünschten Datensätze zu, das weiß ich leider nicht wirklich
 

Sempervivum

Erfahrenes Mitglied
Müsste dann etwa so aussehen:
Code:
$json_file = "linklist/cache/list.json";
$file_contents = file_get_contents($json_file) or exit($html_header . "<p>Error: Can't open the profile file.</p>");
$array = json_decode($file_contents, true);
$linklist = $array['sites'];
var_dump($linklist);
$linklist_euro = array_filter($linklist, function ($item) {
    return ($item['currency'] == 'EUR');
});
shuffle($linklist_euro);
var_dump($linklist_euro);

// und dann weiter unten einfach die ersten drei Eintraege nehmen

for ($i = 0; $i < 3; $i++) {
    $item = $linklist_euro[$i];
    // hier kannst Du jetzt deine Linkliste erzeugen
}
 
Zuletzt bearbeitet:

klausi89

Erfahrenes Mitglied
Ok danke sehr bis var_dump ($linklist_euro); funktuioniert das einwandfrei.

Mit der Ausgabe habert es jez noch, kann ich nun einfach $item as $tablelinks einsetzen damit er das in der Tabelle anzeigt? Oder wie wird das nun weiter verarbeitet. Das beschriebene funktioniert jedenfalls nicht
 

Sempervivum

Erfahrenes Mitglied
So weit hatte ich es jetzt nicht getestet, aber so sollte es eigentlich funktionieren:
echo '<td class="col-sm-4 text-center">' . $item['siteName'] . '</td>'; // Name
Wenn nicht, werde ich mal meine Testdatei ergänzen.
 

klausi89

Erfahrenes Mitglied
ok danke...wenn ich das so einsetze bekomme ich einen Seitenname, ich bräuchte doch aber die dazugehörigen Sachen wie currency und link noch dazu....sry stehe gerade aufm Schlauch.....:)
 

Sempervivum

Erfahrenes Mitglied
Dann brauchst Du ja nur die anderen Zeilen zu ergänzen:
Code:
        for ($i = 0; $i < 3; $i++) {
              $item = $linklist_euro[$i];

              echo '<tr>';
              echo '<td class="col-sm-4 text-center">' . $item['siteName'] . '</td>';    // Name
              echo '<td class="col-sm-2">' . $item['currency'] . '</td>';    // Währung
              echo '<td class="col-sm-2"><a class="btn btn-info hover-effect py-1" onclick="window.open(&quot;' .$item['link'].'&quot;);" href="javascript:void(0);" rel="nofollow noopener">Seite besuchen <i class="fa fa-external-link"></i></a></td>';
              echo '</tr>';
          }
 

klausi89

Erfahrenes Mitglied
Guten Morgen....ich hatte einen kleinen Fehler drin, jez funktioniert alles wie gewünscht. Ich danke dir wie verrückt und wünsche einen schönen Sonntag.

Gruß
 

Neue Beiträge