Avatar billede shjorth Nybegynder
09. oktober 2012 - 15:59 Der er 12 kommentarer

PHP Funktion

Hejsa.

Jeg skal lave en funktion, og ville høre jer om det er den rigtige metode jeg har tænkt mig at bruge eller om der findes en smartere vej.

Funktionen skal i al enkelthed kunne flg:

Et arrary af tal kastes ind i funktionen. Det kunne være
array(1,1A,2,3B);

Funktionen skal så kaste flg tilbage:

1B,2A,2B,3,3A

Altså er der 3 tal kombinationer x - xA - xB, og funktionen returnere dem der ikke er i arrayet.

Min umiddelbare tanke var at lave noget lign:

function tal($arr) {
  $tal = 18;
  for ($i = 1; $i <= $tal; $i++) {
    if(in_array($i,$arr) {
      if(in_array($i.'A',$arr) {
      if(in_array($i.'B',$arr) {
        }else{
        // Noget
        }
      }else{
      // Noget
      }
    }else{
    //noget
    }
  }
}

Men jeg er overbevist om at den metode er yderst ineffektiv. Så jeg ville lige høre om der er en smartere fremgangsmåde ?

Håber det er til at forstå :)
Avatar billede scootergrisen Nybegynder
09. oktober 2012 - 16:11 #1
1, 2 og 3 er tal.
1A, 2B er ikke tal. Det er strenge.

Når du skriver tal kan du godt skrive array(1,2,3);
Men når du skriver strenge skal du skrive array('2A', '3B');
Avatar billede shjorth Nybegynder
09. oktober 2012 - 16:15 #2
Ja, selvf. Det var blot et eksempel (et dårligt af slagsen) ;)
Avatar billede olebole Juniormester
09. oktober 2012 - 16:21 #3
<ole>

$arr = array('1A', '2B', '3C');
echo implode(',', $arr);


implode

/mvh
</bole>
Avatar billede shjorth Nybegynder
09. oktober 2012 - 16:26 #4
Jeg tror desværre i misforstår mig.

Det jeg ville undgå var det loop med in_array in_array in_array. Hvis der altså er en smartere måde at gøre det på :)
Avatar billede michael_stim Ekspert
09. oktober 2012 - 16:40 #5
Ved ikke om jeg er på rette vej, men det er jo ikke så let at vide, men der er forskellige array_diff funktioner i PHP:

http://php.net/manual/en/function.array-diff.php
Avatar billede olebole Juniormester
09. oktober 2012 - 17:04 #6
Jeg forstår sandelig godt, du ønsker at minimere brugen af in_array så meget som muligt - og specielt i sådan en konstruktion. Hvad skal du bruge det til - hvordan - og hvorfor? Det er ikke usandsynligt, der kan bygges lidt om, så løsningen bliver bedre.
Avatar billede shjorth Nybegynder
09. oktober 2012 - 17:50 #7
En lidt dybere forklaring.

En landingsbane (til fly) har på sig et tal. F.eks 01 og op til 18.
Samtidig findes kombinationen 01R og 01L.

Funktionen skal altså returnerer de mulige kombinationer der findes ud fra de data i arrayet.
Dvs at hvis arrayet ser således ud:

arr = array('01','01R','02L');

Så returnerer funktionen:

// 01 - Returneres ikke fordi den er i arrayet
// 01R - Returneres heller ikke da den er i arrayet
01L
02
02R
// 02L - Er også i array og returneres ikke
03
03R
03L
osv osv osv op til 18

Håber det gav bedre mening
Avatar billede olebole Juniormester
09. oktober 2012 - 17:59 #8
Hvordan dannes array'et? Kan det evt. gives en anden struktur?
Avatar billede shjorth Nybegynder
09. oktober 2012 - 18:00 #9
Det laves ud fra en database tabel, så det kan det vel i teorien sagtens ?
Avatar billede moddi100 Seniormester
09. oktober 2012 - 18:48 #10
Du opskriver blot alle kombinationer i et array (enten manuelt eller generer det) og så benytter du funktionen array_diff:

function ledige($brugte)
{
  // Manuelt
  $mulige = array('1', '1a', '1b', '2', '2a', '2b', '3', '3b', '3c');
 
  // Eller generer alle
  $mulige = array();
  for($i = 1; $i <= 18; $i++)
  {
    $mulige[] = $i;
    $mulige[] = $i . "a";
    $mulige[] = $i . "b";
  }

  return array_diff($mulige, $brugte);
}


Se mere på http://php.net/array_diff
Avatar billede olebole Juniormester
09. oktober 2012 - 19:35 #11
En generel god måde at undgå in_array på, er ved at bruge en 'hash-tabel' i stedet:

$tal = array(
    '1' => 1,
    '1A' => 1,
    '2' => 1,
    '3B' => 1
);

Så kan du spørge med:

if ($tal[$something]) {
  // DoDaShit
}

- hvilket er langt mere effektivt end in_array
Avatar billede shjorth Nybegynder
10. oktober 2012 - 19:58 #12
#10 - Lige det jeg ledte efter, smider du et svar ? :)

#11 - Muligvis ligeså god en løsning, jeg forstår den bare ikke ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester