Welcome, Guest. Please login or register.
Did you miss your activation email?
May 26, 2012, 05:23:20 PM

Login with username, password and session length
Search:     Advanced search
Interested in joining the WebsiteBaker team?
For more Information read here or on our new website.
155544 Posts in 21714 Topics by 7736 Members
Latest Member: chris85
* Home Help Search Login Register
Pages: [1]   Go Down
Print
Author Topic: Wahhh!!! - PHP Frage zu Array  (Read 758 times)
fischstäbchenbrenner

Offline Offline

Posts: 271



« on: April 09, 2011, 05:23:27 PM »

Ich weiß, das gehört in ein PHP-Forum...
aber..

Wie bekomme ich bei einem Array den zb 5. Eintrag, egal welchen Key der hat?
Wie lösche ich den 5. Eintrag, unabhängig vom Key?



Logged

Burn, baby, burn!
Stefek
WebsiteBaker Org e.V.

Offline Offline

Posts: 4884



« Reply #1 on: April 09, 2011, 07:40:57 PM »

Zieh das Array durch eine Schleife und bau einen zähler mit ein.

Kommt natürlich noch drauf an, wie Du die Schleife durchläufst (for, foreach, while).

Kommt auch etwas drauf an, wieviele Ebenen das Array hat.

Gruß,
Stefek
Logged

"In a time of universal deceit, telling the truth becomes a revolutionary act."
- George Orwell, Nineteen eighty-four (1984)
FrankH

Offline Offline

Posts: 735


WWW
« Reply #2 on: April 10, 2011, 09:35:30 AM »

> Wie bekomme ich bei einem Array den zb 5. Eintrag, egal welchen Key der hat?

Gezählt wird ab 0, der 5. Eintrag ist also $a[4]

> Wie lösche ich den 5. Eintrag, unabhängig vom Key?

unset($a[4]);

Sehr hilfreich ist in solchen Fällen meist http://de3.php.net/manual/de/function.unset.php
Logged

Ochs und Esel in ihrem Lauf
halt ich leider auch nicht auf
fischstäbchenbrenner

Offline Offline

Posts: 271



« Reply #3 on: April 10, 2011, 09:49:31 AM »

Und was wenn der 5. Eintrag den Key 2 hat, und der 7. den Key 5?
dann liefert $a[5] den 7. Eintrag und nicht den 5. (Klar: 4 bzw 6, weil index ab 0)

Die mäßig elegante Lösung scheint zu sein, mit array_merge() immer wieder alle keys neu zu setzen.
Es geht darum, ein Element zufällig auszuwählen, aber dieses soll dann länger nicht mehr vorkommen:
Also eher vorne rausnehmen, hinten wieder anhängen.

Code:
$arrayx = array();
$r = rand ( 0 , count($longlist) / 2);
$tx = $longlist[$r];
unset ($longlist[$r]);
$longlist = array_merge($longlist, $arrayx);
$longlist[] = $tx;

Ohne arraymerge liefert dieser Code in einer Schleife sofort einen Haufen Fehler, weil es ja  $longlist[$r] bald nicht mehr gibt (wurde ja gelöscht)
« Last Edit: April 10, 2011, 09:53:42 AM by fischstäbchenbrenner » Logged

Burn, baby, burn!
NorHei
Forum administrator
*****
Offline Offline

Posts: 485



WWW
« Reply #4 on: June 28, 2011, 09:20:06 AM »

Wenn Du zufällig was rauslöschen möchtest .

http://www.php.net/manual/de/function.array-rand.php

und dann unset. , Nur so eine Idee.

Logged

It is easier to change the specification to fit the program than vice versa.
fischstäbchenbrenner

Offline Offline

Posts: 271



« Reply #5 on: June 28, 2011, 09:57:44 AM »

Jo, ich will ja nicht _irgendwelche_ zufälligen Einträge, sondern nur aus den ersten Elementen.

Der Sinn der Sache:
Wenn ein Element dargestellt wurde, soll es nicht gleich wieder kommen, sondern die Elemente bevorzugt werden, die schon länger nicht dran waren.

Ich habe also zunächst eine Liste:
1,2,3,4,5,6,7,8

Ich nehme nur aus der ersten Hälfte
$r = rand ( 0 , count($longlist) / 2);

Das liefert zb 1 und 4
Ich stelle 1 und 4 dar, lösche sie aus der Liste, hänge sie hinten dran:
2,3,5,6,7,8,1,4

Beim nächsten (und übernächsten) Mal kann 1 und 4 SICHER nicht mehr vorkommen.

Da es noch weitere Faktoren gibt, werden immer diejenigen bevorzugt, die schon länger nicht mehr dran waren.
Logged

Burn, baby, burn!
hellblazer

Offline Offline

Posts: 40


« Reply #6 on: June 28, 2011, 01:40:43 PM »

Code:
Hallo Chio
Da hast Du es ja schon fast;
schau dir mal "array_shift" und "array_push" mal an (optional auch noch "shuffle")
<?php

/**
 * Array mit 10 Elementen anlegen
 * -- [1,2,3,4,5,6,7,8,9,10]
 */
$a range(1,10);

/**
 * Erste Element vom Array in Var und löschen
 * -- [2,3,4,5,6,7,8,9,10]
 */
$element array_shift($a);

/**
 * Irgendwas nun damit machen
 *
 */
echo "<p>".$element."</p>";

/**
 * Element hinten an das Array anfügen
 * -- [2,3,4,5,6,7,8,9,10,1]
 */
array_push($a$element);
?>


Somit wird beim durchlauf jedes Element einmal, genau einmal, genommen.

Edit
Und wenn es zufällig sein soll vorher "mischen"
Code:
<?php

/**
 * Array mit 10 Elementen anlegen
 * -- [1,2,3,4,5,6,7,8,9,10]
 */
$a range(1,10);

/**
 * Array mischen
 * -- [6,8,2,3,9,7,1,4,5,10]
 */
shuffle($a);

/**
 * Schleife
 */
$n=count($a);
for(
$i=0;$i<$n$i++) {
/**
 * Erste Element vom Array in Var
 * -- [8,2,3,9,7,1,4,5,10]
 */
$element array_shift($a);

/**
 * Irgendwas nun damit machen
 *
 */
echo "<p>".$element."</p>";

/**
 * Element hinten an das Array anfügen
 * -- [8,2,3,9,7,1,4,5,10,6]
 */
array_push($a$element);
}

?>

MfG
Stefan
« Last Edit: June 28, 2011, 01:51:36 PM by hellblazer » Logged

It's not the PHP itself - it's the thought behind it, that drives me mad.
DarkViper
Development Team
*****
Offline Offline

Posts: 1253


« Reply #7 on: June 28, 2011, 01:53:12 PM »


Das löst Deine Probleme komplett und einfach:

The ArrayIterator class

  • mit ::seek den n-ten Eintrag suchen
  • mit ::current den Wert holen
  • mit ::offsetUnset den aktuellen Wert löschen und
  • mit ::append  hinten wieder anhängen

(SPL::ArrayIterator ist eine standard PHP-Klasse seit PHP5)

Kannst das ganze aber auch zu Fuß coden:

Code:
<?php
// works with numeric and associative index as well
$list = array(... whateveryouwant ...);
$position rand0, (int)(sizeof($list) / 2));  // or some other randomizer
$i 0;
foreach(
$list as $key => $value) {
   if( ++
$i >= $position ) { break; } // break the foreach if position matches
}
unset( 
$list[$key] );  // delete entry from original position
$list array_merge$list, array( $key=>$value ); // append entry at the end of list

$result $value;  // here the result value

?>
Logged

Anleitungen lesen und selber nachdenken ist anstrengend...  Da lass ich doch lieber andere für mich denken...

In 1984:  Nineteen Eighty-Four is a unrealistic utopia!!
In 2012:  Nineteen Eighty-Four is a little piece only of our reality!!
NorHei
Forum administrator
*****
Offline Offline

Posts: 485



WWW
« Reply #8 on: June 28, 2011, 07:50:26 PM »

I thought merge resorts the indexes sad Huh

I think simply adding the Array will do the job :
http://www.php.net/manual/en/language.operators.array.php

Or just add a new Element $array[$key]=$value;

MAybe you would like to use key(), next(), prev(), reset()


« Last Edit: June 28, 2011, 08:12:52 PM by NorHei » Logged

It is easier to change the specification to fit the program than vice versa.
fischstäbchenbrenner

Offline Offline

Posts: 271



« Reply #9 on: June 29, 2011, 12:17:37 PM »

Hallo,
An sich ist das Problem ja schon gelöst (siehe oben)
Es kam mir nur so "verquer" vor, ich dachte das muss ja einfacher gehen...

Es ging übrigens um diese Seite:
http://www.ig-jazz.at/ (Highlights)
Die Clubs, die seltener Events machen, sollen vorgereiht werden, _wenn_ sie mal einen haben. Wie zb am Freitag der "Radfahrer" - auch wenn 10 weitere Clubs ein Event haben.
Logged

Burn, baby, burn!
Pages: [1]   Go Up
Print
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.16 | SMF © 2011, Simple Machines Valid XHTML 1.0! Valid CSS!