Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  12 991
Jeg har funnet: array_shift og array_pop som kan ta ut første eller siste element fra et array, men finnes der en funksjon for å ta ut nth/nte element av et array? Da med referanse til nøkkel.
Sist endret av fxxked; 25. mars 2011 kl. 10:24.
Er ikke så bevandret i php, men har du anledning til å bruke hashmaps så fungerer det bedre til det du ønsker her. Ikk skyt meg om det ikke finnes til php
m0b
m0b's Avatar
DonorAdministrator
Hvilken datatype er nøkkelen?

Disse skal gi samme resultat.

Kode

// Integer
$array = array( 10, 20 );
echo $array[1];

// Streng
$array = array( 'ti' => 10, 'tyve' => 20 );
echo $array['tyve'];
Edit: med n-th element, bruker du bare integerverdier som array-indeks for å hente ut elementet.
Sist endret av m0b; 25. mars 2011 kl. 10:53.
Kan du hva du har tenkt til å gjøre?

Kode

<?php
$a = array('a', 'b', 'c');
print $a[1]; // 'b'
?>
Litt for sein der, gitt.
Sist endret av dassmongo; 25. mars 2011 kl. 10:51.
fxxked's Avatar
Trådstarter
Jeg trenger å fjerne det nte elementet i et array, men å beholde innholdet.

Det jeg gjør nå er

Kode

$array = array( 'ti' => 10, 'tyve' => 20, 'tretti' => 30, 'førti' => 40 );
$array2['ny'] = $array['tyve'];
unset( $array['tyve'] );
Det jeg skrev nå er skrevet inn fra hukommelsen, mulig det vil bli korrigert i ettertid.

Det jeg tror bør eksistere ville vært noe omtrent slik

Kode

$array = array( 'ti' => 10, 'tyve' => 20, 'tretti' => 30, 'førti' => 40 );
$array2['ny'] = array_shift( $array, 'tyve' );
Sist endret av fxxked; 25. mars 2011 kl. 11:27.
m0b
m0b's Avatar
DonorAdministrator
Okei, det du kan gjøre er å lage en funksjon som gjør det, og returnerer det elementet du ønsker.

For å konkretisere:
* En referanse til arrayet og key blir sendt til en funksjon
* Hvis elementet ikke eksterer, returneres verdien null
* Funksjonen henter ut array-elementet og lagrer det i en lokal variabel
* Funksjonen setter en unset på elementet i arrayet
* Returner lokal variabel

Skriver det enkelt og rett fram uten å følge så veldig mye konvensjoner i forhold til returns. Du kan sjekke om elementet eksisterer med å sjekke om funksjonen har returnert verdien null. Jeg valgre null i stedet for false fordi i dette tilfellet synes jeg at arrayet kan ha forskjellige datatyper i seg, inkludert objekter, og da synes jeg personlig at det er greit å forholde seg til nullverdier. Det er ikke sagt at dette er det beste valget, men det er nå det jeg valgte nå, og valget kan sikkert diskuteres videre i forhold til kontekst. Strengt tatt bør man kanskje vurdere å skrive litt mer defensivt, med tanke på at nullverdier kan sendes inn.

Det er mulig man kan vudere å sette standardverdiene på parametrene til null, og sjekke mot dette når du har sendt inn parametrene. Dette innebærer endring av funksjonen til function removeFromArray( &$a = null, $k = null )

Kode

<?php
$array = array( 'ti' => 10, 'tyve' => 20, 'tretti' => 30 );

function removeFromArray( &$a, $k )
{
  $element = $a[$k];
  if( $element ===  null )
    return $element;

  unset( $a[$k] );

  return $element;
}

var_dump( $array );

$fromArray = RemoveFromArray( $array, 'tyve' );

var_dump( $array );
var_dump( $fromArray );
?>
Resultat

Kode

kenwi@ganymede.0x90.lol:~$ php array.php
array(3) {
  ["ti"]=>
  int(10)
  ["tyve"]=>
  int(20)
  ["tretti"]=>
  int(30)
}
array(2) {
  ["ti"]=>
  int(10)
  ["tretti"]=>
  int(30)
}
int(20)
Sist endret av m0b; 25. mars 2011 kl. 12:06.
fxxked's Avatar
Trådstarter
Ja, det er det jeg har nå, er det best practice?

Med unntak av at min ser slik ut:

Kode

function array_shift_nth( &$a, $k ) {
	if( is_array( $a ) and is_string( $a[$k] ) ) {
		$e = $a[$k];
		unset( $a[$k] );
	}
	return $e;
}
Penere i farger kanskje?

Kode

function array_shift_nth( &$a, $k ) {
	if( is_array( $a ) and is_string( $a[$k] ) ) {
		$e = $a[$k];
		unset( $a[$k] );
	}
	return $e;
}
Kanskje det er bedre å bruke:

Kode

if( $element ===  null )
men det er vel ikke noe i php som ikke er string?
m0b
m0b's Avatar
DonorAdministrator
Det avhenger nok av mange faktorer. Synes at det må tas litt i kontekst, rett og slett fordi man kan nesten ikke bare si at et array er et array. Du har minimum to "forskjellige" sekvensielle arrays i php med tanke på innebygde funksjoner, assosiative array og ikke assosiative arrays. Forskjellen er hva som blir brukt som key.

Hvis du har et ikke assosiativt array så kan du gjerne bruke array_slice for å hente ut, og fjerne et gitt element med offset som index for hvilket element du skal slette, og length lik 1.

Kode

array array_splice ( array &$input , int $offset [, int $length = 0 [, mixed $replacement ]] )
Hvis du ønsker en funksjon som kan gjøre det samme, med array_splice så må du hente ut index. Dette kan du gjøre med array_search. Jeg har ikke sjekket hva som blir kjappest enda, så det kan eventuelt bli en oppgave til den som synes slikt er interessant. Har ikke tid til å gjøre det akkurat nå.

En annen avgjørende faktor er også antall elementer som du har i arrayet ditt. Blir det veldig stor, kan det skje veldig interessante ting med tanke på ytelse. I forhold til dette kan du ta en titt på "Big O Notation". Nå har jeg ikke sjekket direkte i kildekoden hva som skjer når man sender inn $array[$k] (og har et enormt array) til php, så det kan være at de faktisk tar høyde for det. Man vet aldri hva de utviklerne der finner på!
Sist endret av m0b; 25. mars 2011 kl. 17:41.
fxxked's Avatar
Trådstarter
Det er maks 250 elementer.

Nei, PHP er et spennende hack.
m0b
m0b's Avatar
DonorAdministrator
Er ikke sikker på hvordan php-motoren gjør det internt, men den skiller i alle fall på datatyper med var_dump og det skulle forundre meg om den assosierte alt med tekst.

Kode

kenwi@ganymede.0x90.lol:~$ php -r "var_dump( 10, '10' );"
int(10)
string(2) "10"
kenwi@ganymede.0x90.lol:~$
Sist endret av m0b; 25. mars 2011 kl. 13:33.
fxxked's Avatar
Trådstarter
Hvilken versjon? Det skal godt gjøres å få noe til å bli string om du ikke kaster.

Eller er det bare php som har en tolker i echo som gjør at int kan skrives som streng?
m0b
m0b's Avatar
DonorAdministrator
Det kommer litt ann på hva man foretrekker å gjøre. Jeg er ikke alltid så veldig glad i eksplisitt casting. I slike tilfeller så bruker jeg måten jeg kunne gjort det i C; med sprintf.

Kode

kenwi@ganymede.0x90.lol:~$ php -v
PHP 5.2.6-2ubuntu4.6 with Suhosin-Patch 0.9.6.2 (cli) (built: Jan  6 2010 22:03:33)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
Kom på at jeg nå for kun kort tid siden brukte diff, og det kom spontant opp en liten tanke hos meg. Jeg har dermed et til forslag på hvordan du kan slette et gitt element. Dette går på verdiene og ikke keys, så du kan da bruke array_diff_keys.

Har heller ikke sjekket hvor mye det koster, ytelsesmessig, å kjøre diff. Det bør også gjøres. Dette blir litt utenfor det du spør etter, men.

Kode

<?php
$array = array( 'ti' => 10, 'tyve' => 20, 'tretti' => 30 );

function RemoveFromArray( $a, $k )
{
  return array_diff( $a, array($k) );
}

var_dump( $array );

$fromArray = RemoveFromArray( $array, 10 );

var_dump( $array );
var_dump( $fromArray );
?>
Sist endret av m0b; 25. mars 2011 kl. 14:05.
fxxked's Avatar
Trådstarter
Jeg syns ikke du har bomma til nå.

Det er viktig å se på aspektene rundt for å ta riktige valg.