3 items random aus json file


klausi89

Erfahrenes Mitglied
Hallo ich habe schon wieder ne frage

ich möchte aus meiner json file 3 items anzeigen aber das ganze random

das auslesen funktioniert super

PHP:
$myData = file_get_contents("./../faucetslistfp/json.php");
    $myObject = json_decode($myData);
    $myObjectMap = $myObject->list_data->normal->Dollar;
dargestellt wird das ganze dann so:

Code:
<div class="jumbotron">
<table id="example" class="table table-striped table-bordered table-hover table-responsive  order-column text-center" width="100%">
<tbody>
      <?php foreach($myObjectMap as $key => $item): ?>
<tr>
      <td><?PHP echo $item->name; ?></td>
      <td><?PHP echo '<img src="./../images/dollar.png" width="25" height="25" border="0" alt="Dollar" title="Dollar"'; ?></td>
      <td><button class="btn btn-primary hover-effect my-2 my-sm-0" onclick="window.open('<?PHP echo $item->url.'/?r='. $adress; ?>')">Visit <i class="fa fa-external-link"></i></button>


          </td>
        </tr>
      <?php endforeach; ?>
    </tbody>
  </table>
 </div>
das funktioniert bis hier her einwandfrei....

nun möchte ich aber nur 3 items in Random auswählen und anzeigen.

Könnte mir da bitte mal jemand helfen?
So gut ist mein PHP dann leider doch nicht.

Danke im voraus
 

Yaslaw

n/a
Moderator
Welche 3 Objekte willst du mischen?
Ich sehe nur den einen Wert Dollar.

Oder stehen in $myObjectMap 3 Werte?
Wenn ja, mach mal ein var_dump($myObjectMap); und poste das Resultat, damit man mal sieht was das Ding ist.
 

klausi89

Erfahrenes Mitglied
Na durch Dollar werden alle items mit Dollar aus der json geholt... ( funktioniert wie gesagt aber eben ellen lange Liste)
Außerdem gibt es noch Euro und Pfund

Bräuchte aber wie gesagt nur immer 3 davon ( random)

Var_dump geht gerade nicht bin aufm Weg zur Schicht bzw. Listet alle items die Dollar verwenden auf
 

Yaslaw

n/a
Moderator
Ist halt nicht einfach zu helfen, wenn man keine Ahnung hat wie die Daten aufgebaut sind.
OK, es kommen viele Einträge und du willst einfach 3 davon auswählen.
Ich geh mal davon aus, $myObjectMap ist ein Array oder ein ArrayObject.

Dann kannst du doch mit PHP: array_rand - Manual arbeiten
 

klausi89

Erfahrenes Mitglied
Genau das ist ein array daraus nehme ich den Namen und die dazugehörige URL...

Ok mit array_rand hab ich noch nicht gearbeitet...probiere es heute Abend mal und hoffe es kommt was dabei rum...:)
 

klausi89

Erfahrenes Mitglied
Hallo ich hab das nochmal etwas abgeändert aber wie ich nun nur 3 Namen (plus dazugehörige Url) random abrufen kann ist mir weiterhin nicht verständlich

Code:
    $myData = file_get_contents("./../faucetslistfp/json.php");
    $myObject = json_decode($myData);
    $linklist = $myObject->list_data->normal->Dollar;
var_dump($linklist); ergibt folgendes......

Code:
object(stdClass)#30 (167)
{ ["0"]=> object(stdClass)#29 (16)
{ ["id"]=> string(2) "16"
  ["name"]=> string(17) "yourearn - Dollar"
  ["url"]=> string(19) "https://dollarearn.example/"
  ["owner_id"]=> string(2) "11"
  ["owner_name"]=> string(7) "dollarman"
  ["currency"]=> string(3) "DOLLAR"
  ["timer_in_minutes"]=> string(2) "30"
  ["reward"]=> string(1) "4"
  ["is_enabled"]=> string(1) "1"
  ["creation_date"]=> string(10) "1575504000"
  ["category"]=> string(17) "1,2,3,4,5,6,7,8,9"
  ["paid_today"]=> string(9) "24.410697"
  ["total_users_paid"]=> string(4) "4244"
  ["active_users"]=> string(4) "7631"
  ["balance"]=> string(10) "13.00834732"
  ["health"]=> string(3) "100" }
 
  ["1"]=> object(stdClass)#31 (16)
{ ["id"]=> string(3) "107"
  ["name"]=> string(15) "earn dollars"
  ["url"]=> string(23) "https://freedollar.example"
  ["owner_id"]=> string(3) "734"
  ["owner_name"]=> string(10) "uniquedollars"
  ["currency"]=> string(3) "DOLLAR"
  ["timer_in_minutes"]=> string(2) "60"
  ["reward"]=> string(4) "4632"
  ["is_enabled"]=> string(1) "1"
  ["creation_date"]=> string(10) "1575616127"
  ["category"]=> string(7) "1,3,4,9"
  ["paid_today"]=> string(8) "5.438821"
  ["total_users_paid"]=> string(1) "8"
  ["active_users"]=> string(2) "72"
  ["balance"]=> string(10) "82.00463676"
  ["health"]=> string(3) "100" }

  ["2"]=> object(stdClass)#32 (16)
{ ["id"]=> string(3) "127"
  ["name"]=> string(15) "Daily Free Money"
  ["url"]=> string(24) "http://dailyfreemoney.example"
  ["owner_id"]=> string(4) "1760"
  ["owner_name"]=> string(13) "dailyfreemoney"
  ["currency"]=> string(3) "DOLLAR"
  ["...................usw.

Mit diesem rufe ich aus der Liste den Namen und die dazugehörige Url ab dies funktioniert einwandfrei, nur eben sind das mehr wie 160 einträge und ich hätte gerne das jedesmal nur 3 angezeigt werden und eben random aus der liste ausgewählt werden.

Code:
<div class="jumbotron">
<table id="example" class="table table-striped table-bordered table-hover table-responsive  order-column text-center" width="100%">
<tbody>
      <?php foreach($linklist as $key => $item):

        echo '<tr>';
        echo '<td class="col-sm-9">'. $item->name .'</td>';
        echo '<td><img src="./../images/'. $imgname.'" width="25" height="25" border="0"</td>';
        echo '<td class="col-sm-3"><a class="btn btn-info hover-effect py-1" onclick="window.open(&quot;' .$item->url.'/?r='. $adress .'&quot;);" href="javascript:void(0);" rel="nofollow noopener">Visit <i class="fas fa-external-link-alt"></i></a></td>';
        echo '</tr>';

        endforeach;
       ?>

    </tbody>
  </table>
 </div>
mit array_rand hab ich schon probiert aber ehrlich gesagt weiß ich garnicht richtig wie ich da ran gehen soll.
Ist leider neuland für mich....
 

Yaslaw

n/a
Moderator
$linklist ist also ein Objekt, nicht ein array. Also zuerst ein Array draus machen.

Hier ein Test, den du auf PhpFiddle Main testen kannt
PHP:
<pre><?php
//Testdaten mit Objekten
$objLinkList = (object) array(
        (object) array('id' => 11, 'name' => 'abc'), 
        (object) array('id' => 12, 'name' => 'def'),
        (object) array('id' => 13, 'name' => 'ghi'),
        (object) array('id' => 14, 'name' => 'jkl'),
        (object) array('id' => 15, 'name' => 'mno'),
        (object) array('id' => 16, 'name' => 'pqr')
    );
//Testausgabe der ganzen Objektliste
print_r($objLinkList);

//Aus dem Object ein Array erstellen
$arrLinkList = (array) $objLinkList;

//3 beliebige Keys auswählen
$arrResultKeys = array_rand($arrLinkList, 3);
//ausgewählte Keys ausgeben
print_r($arrResultKeys);

//Anhand der Keys die Datensätze auswählen.
$arrResult = array_intersect_key($arrLinkList, array_flip($arrResultKeys));

print_r($arrResult);
?></pre>
 

Yaslaw

n/a
Moderator
Ist ja alles erklärt. Und wenn du den Code so mal testest (zb auf PhpFiddle Main) dann siehst du auch alle Zwischenresultate.
Wenn du ein Befehl nicht kennst, dann schau in der Online-Hilfe.

Ansonsten, was verstehst du nicht?
 

klausi89

Erfahrenes Mitglied
na woher kommt jez objLinklist .... soll ich jez so eine liste erstellen?
ach keine Ahnung das übersteigt bei weitem meine kenntnisse
 

Yaslaw

n/a
Moderator
Mein Code ist ein Beispiel. Ein in sich geschlossener Code. Ist nicht dein Code.
Und da steht zu $objLinkList: //Testdaten mit Objekten
Also, in meinem Beispiel simuliere ich das Auslesen der Daten aus einem XML mit Testdaten. In der Ausgabe siehst du dann, dass die Grundstruktur Deiner gleich ist. Es ist auch ein Objekt mit mehreren Objekten drin.

Darum, nochmals: Test das Beispiel mal mit PhpFiddle Main
Falls das Testen zu kompliziert ist, hier die Printscreens von meinem Test

Der Test-block einfügen auf run klicken
2020-01-23_120027.jpg

Die Testausgabe. Darim sieht man die 3 Testausgaben. Zuerst die simulierten Daten, dann die ausgewählten Keys und dann noch die Daten die zu den ausgewählten keys passen.
2020-01-23_120059.jpg


Also mehr erklärung brauchst du wirklich nicht.
 

klausi89

Erfahrenes Mitglied
Hmmm....also ich hab nun mal folgendes gemacht

Code:
$arrLinkList = (array) $linklist;

//3 beliebige Keys auswählen
$arrResultKeys = array_rand($arrLinkList, 3);
//ausgewählte Keys ausgeben
print_r($arrResultKeys);

//Anhand der Keys die Datensätze auswählen.
$arrResult = array_intersect_key($arrLinkList, array_flip($arrResultKeys));

print_r($arrResult);
angezeigt bekomme ich das

Array ( [0] => 11 [1] => 70 [2] => 123 ) Array ( )

kann leider trotzdem nichts damit anfangen.....
wie gesagt php neuling....wie wird sowas weiterverarbeitet?
ich weiß es einfach nicht..soviel wie ich auch lese ich verstehe es eben nicht, bräuchte mal jemanden der mir das ordentlich erklärt...
 

Yaslaw

n/a
Moderator
Die erste Ausgabe sind die ausgewählten Keys
Dass der 2te Array leer ist, das verwundert mich jetzt.

Versuchs mal damit:
PHP:
//Anhand der Keys die Datensätze auswählen.
//Wird abgelöst durch di unten stehende Schleife:  $arrResult = array_intersect_key($arrLinkList, array_flip($arrResultKeys));
$arrResult = array();
foreach ($arrResultKeys as $idx){
    $arrResult[] = $arrLinkList[$idx];
}
 

klausi89

Erfahrenes Mitglied
Also hab das jetzt nochmal ausprobiert

PHP:
print_r($arrResultKeys);

foreach ($arrResultKeys as $idx){
    $arrResult[] = $arrLinkList[$idx];

print_r($arrResult);
  }
bis arrResultkeys scheint es erstmal zu funktionieren,

Code:
Array ( [0] => 21 [1] => 74 [2] => 162 )
die Werte ändern sich auch nach jedem Aufruf.....

arrResult zeigt folgendes:

Code:
Array (    [0] => )
Array (    [0] =>     [1] => )
Array (    [0] =>     [1] =>     [2] => )
? Irgendwie alles leer
 

Yaslaw

n/a
Moderator
Kannst du auf php 7.2 updaten? Würde sich in dem Fall lohnen

Neuer Versuch. Umd ie ausgewürfelten Einträge herauszulesen greifen wir mal direkt auf die Originalliste
PHP:
$arrResult = array();
foreach ($arrResultKeys as $idx){
    $arrResult[] = $linklist->{(string) $idx};
}
 

klausi89

Erfahrenes Mitglied
Also ich habe das nun mit var_dump mal anzeigen lassen und ich denke in Array(3) stehen die richtigen daten nun drin...aber wie genau kann ich das jetzt abrufen.
 

Anhänge

Yaslaw

n/a
Moderator
Array 3 ist j ader $arrResult am Schluss. Die anderen 2 Ausgaben sind nur, weil du den print_r innerhalb der Schleife hast. Sind also nur Zwischenschritte.
Das sind deine 3 Einträge, die du ausgewürfelt hast. Über diesen kannst du dann deine foreach-Schleife setzen

PHP:
<?php foreach($arrResult as $key => $item): ?>
 

klausi89

Erfahrenes Mitglied
ach ja so hatte ich das ja schon aber da stand $linklist drin.....einwandfrei jetzt funktioniert es genauso wie ich mir das vorgestellt habe. Gerlernt hab ich auch wieder was.
Vielen Dank :)
 

Neue Beiträge