Avatar billede _et Praktikant
20. marts 2012 - 10:16 Der er 16 kommentarer og
1 løsning

Syntax ved assignment mellem stdClass og array

Jeg oplever problemer med assignment mellem stdClass og arrays.

Jeg vil derfor gerne høre hvad syntaksen er for assignments mellem arrays og objekter på kryds og tværs.

$a = new stdClass();
$a->first = "en tekst";

$b = new stdClass();
$b->second = "anden tekst";
$b->third= "tredie tekst";
$b->fourth= "fjerde tekst";

$c = array("1","2","3");

Hvordan er den korrekte syntaks fo disse fire nedenstående assignmens?

b->first = a->first
b->second = c[0]
c[1] = b->third

desuden tilfældet hvor $b ligger i arrayet test[1]:
c[2] = test[0]->fourth

Mvh
Teddy
Avatar billede olebole Juniormester
20. marts 2012 - 13:08 #1
<ole>

$b->first = $a->first;
$b->second = $c[0];
$c[1] = $b->third;

- og:

$c[2] = $test[1]->fourth;

/mvh
</bole>
Avatar billede olebole Juniormester
21. marts 2012 - 11:34 #2
Hjalp det?
Avatar billede _et Praktikant
21. marts 2012 - 11:43 #3
Jeg er pt. optaget i en anden afdeling af source, men det er samme syntax som jeg selv har anvendt...

men jeg vender tilbage til problemet senere idag og lader høre fra mig.

Kan der være noget med "by value" vs "by reference" det er en returværdi der er fra data?

mvh
Avatar billede olebole Juniormester
21. marts 2012 - 11:54 #4
Der er ikke særlig forskel på håndteringen, når du har værdier liggende i 'løse' variabler - i arrays - eller i objekter. Om du skal bruge by reference eller by value kommer an på, om en ændring det ene sted skal reflekteres det andet sted.

Når du kommer tilbage, så prøv at forklare lidt mere om, hvad det er, du ønsker at gøre
Avatar billede _et Praktikant
21. marts 2012 - 11:56 #5
10-4 :-)
Avatar billede _et Praktikant
22. marts 2012 - 10:14 #6
Godmorgen..

Her er lidt kode..
Jeg henter data($acl) fra DB inden det slettes forat kunne placere det i en log ( CreateInUserLog($a) )

--------------------------------------------------
$acl = $this->GetFwtCustInfo($_fwtId);
$result = $this->DeleteFwtDB($_fwtId);
if ($result)
{
    // DO $a = $acl + manglende data eller manipuler $acl
  CreateInUserLog($a);
....
----------------------------------------------------

"formen" på $acl er som følger: (et var_dump)
array(1) {
  [0]=>
  object(stdClass)#7 (12) {
    ["fwtid"]=>
    int(73724)
    ["custname"]=>
    string(0) ""
    ["adr"]=>
    string(3) "087"
    ["adrno"]=>
    string(0) ""
    ["floor"]=>
    string(0) ""
    ["town"]=>
    string(0) ""
    ["postal"]=>
    string(0) ""
    ["region"]=>
    string(0) ""
    ["voiceno"]=>
    string(9) "875625095"
    ["faxno"]=>
    string(9) "875699893"
    ["datano"]=>
    string(9) "875699894"
    ["serialno"]=>
    string(0) ""
  }
}

Modtageren forventer også samme form
------------------------------------------
  foreach($_dataArray as $dataObj)
  {
      $result = CreateEntryInUserLog($db_conn, $dataObj);
------------------------------------------
      $_dataObj->main,
      $_dataObj->createtype,
      $_dataObj->user,
      $_dataObj->ref,
      $_dataObj->date,
      $_dataObj->status,
      $_dataObj->statustext,
      $_dataObj->name,
      $_dataObj->adr,
      $_dataObj->adrno,
      $_dataObj->floor,
      $_dataObj->town,
      $_dataObj->postal,
      $_dataObj->region,
      $_dataObj->voiceno,
      $_dataObj->faxno,
      $_dataObj->datano,
      $_dataObj->simcard,
      $_dataObj->gsmvoice,
      $_dataObj->gsmfax,
      $_dataObj->gsmdata,
      $_dataObj->serialnumber,
      $_dataObj->otherinfo

Som du kan se er der mange ens felter i de to objekter.
Derfor ville jeg helst rette i $acl, men f.eks $acl's ["serialno"] skal hedde ["serialnumber"] i CreateInUserLog()
- det felt vil jeg omdøbe og jeg vil så tilføje de manglende felter.

kan jeg ikke oprette prototypen $acl = array(stdClass(main="", createtype="",.....))
og så overskrive $acl med retur værdien $this->GetFwtCustInfo($_fwtId); uden at de felter som ikke er med i retur objektet forsvinder??

Eller har du et andet forslag?
Avatar billede olebole Juniormester
22. marts 2012 - 13:59 #7
Sorry, men jeg forstår ikke din forklaring  =)
Avatar billede _et Praktikant
22. marts 2012 - 14:09 #8
Det kan jeg godt forstå :-)

Kort sagt:

foo = array[1] med 1 stdClass[3] med 3 elementer ( a="", b="" og c="" )
bar = array[1] med 1 stdClass[2] med 2 elementer ( a="1" og c="2" )

kan jeg "lægge dem sammen" (foo += bar) så det bliver til
foobar = array[1] med 1 stdClass[3] med 3 elementer ( a="1", b="" og c="2" )

??
Avatar billede olebole Juniormester
22. marts 2012 - 14:27 #9
Ikke uden at traversere objekternes properties. Selvom a='1' i dit tilfælde giver mere mening end a='', kan det jo være stik modsat i mange andre situationer. Så hvad skulle en sådan funktion så vælge?  =)
Avatar billede _et Praktikant
22. marts 2012 - 14:38 #10
Jeg kan godt se hvad du mener med hvad skulle vælges, men det kunne jo evt baseres på side af operatoren
som f.eks  a <= b    // a overskrives og tilføjes mangler fra b

men det er jo kun teoretisk
Så må jeg jo gøre det på den hårde måde..

tak for hjælpen
Avatar billede olebole Juniormester
22. marts 2012 - 14:48 #11
Der er måske alligevel en mulighed:

<?php
$clA = new stdClass();
$clB = new stdClass();

$clA->a = '';
$clA->b = '';
$clA->c = '';
$clA->d = 'D';

$clB->a = 'A';
$clB->b = '';
$clB->c = 'C';
$clB->d = '';

$a = (array) $clA;
$b = (array) $clB;

$a = array_flip($a);
unset($a['']);
$a = array_flip($a);

$b = array_flip($b);
unset($b['']);
$b = array_flip($b);

$c = (object) array_merge($a, $b);

var_dump($c);
?>
Avatar billede _et Praktikant
23. marts 2012 - 10:53 #12
Det ser interessant ud, men jeg har lavet en anden løsning..
Primært for du der kan være forskel på hvilke parametre der er med fra gang til gang.

$acl = $this->GetFwtCustInfo($_fwtId);

$acl[0]->main             = "1";
$acl[0]->createtype     = "DELETEFWT";
$acl[0]->user             = GetUserInitials();
$acl[0]->ref             = ( $acl[0]->ref             ? $acl[0]->ref : "");
$acl[0]->date             = date("Y-m-d H:i:s");
$acl[0]->status         = ( $acl[0]->status         ? $acl[0]->status : "1");
$acl[0]->statustext     = ( $acl[0]->statustext     ? $acl[0]->statustext : "FWT deleted from DB");
$acl[0]->name             = ( $acl[0]->custname         ? $acl[0]->custname : "");
$acl[0]->adr             = ( $acl[0]->adr             ? $acl[0]->adr : "");
$acl[0]->adrno         = ( $acl[0]->adrno             ? $acl[0]->adrno : "");
$acl[0]->floor         = ( $acl[0]->floor             ? $acl[0]->floor : "");
$acl[0]->town             = ( $acl[0]->town             ? $acl[0]->town : "");
$acl[0]->postal         = ( $acl[0]->postal         ? $acl[0]->postal : "");
$acl[0]->region         = ( $acl[0]->region         ? $acl[0]->region : "");
$acl[0]->voiceno         = ( $acl[0]->voiceno         ? $acl[0]->voiceno : "");
$acl[0]->faxno         = ( $acl[0]->faxno             ? $acl[0]->faxno : "");
$acl[0]->datano         = ( $acl[0]->datano         ? $acl[0]->datano : "");
$acl[0]->simcard         = ( $acl[0]->simcard         ? $acl[0]->simcard : "");
$acl[0]->gsmvoice         = ( $acl[0]->gsmvoice         ? $acl[0]->gsmvoice : "");
$acl[0]->gsmfax         = ( $acl[0]->gsmfax         ? $acl[0]->gsmfax : "");
$acl[0]->gsmdata         = ( $acl[0]->gsmdata         ? $acl[0]->gsmdata : "");
$acl[0]->serialnumber     = ( $acl[0]->serialno         ? $acl[0]->serialno : "");
$acl[0]->otherinfo     = ( $acl[0]->otherinfo         ? $acl[0]->otherinfo : "");
unset($acl[0]->custname);
unset($acl[0]->serialno);
unset($acl[0]->custname);

$result = $this->DeleteFwtDB($_fwtId);

men tak for forsøget og god weekend
Avatar billede olebole Juniormester
23. marts 2012 - 12:59 #13
Det var godt, for der er nogle kedelige issues med #11. F.eks. at to properties med samme værdi bliver slået sammen til én
Avatar billede _et Praktikant
23. marts 2012 - 14:15 #14
Jeg takker for hjælpen igen ;-)

Ps. Er det bare mig eller er det træls at ekspertens side generere fejl i firebug??

Jeg sidder ofte og tænker, hvor for hænger den nu? og så er det bare firebug..
Øv
Avatar billede olebole Juniormester
23. marts 2012 - 14:36 #15
Eksperten kyler om sig med fejl. Siden IDG overtog sitet, har interessen for brugerne (som vel at mærke også er eneste indholdsleverandører) kunnet ligge under en nordsvensk skovarbejders afhuggede lillefingernegl.

Filosofien synes at være, at 'Hvorfor parfumere bæ'en, sålænge kunderne køber den?'. Admin er desværre totalt fraværende og handlingslammet. En sjælden gang imellem undslipper ham en svag brise med en duft af Sorbits. Ikke desto mindre bliver det ved tomme ord.

Tjek linket til det seneste blogindlæg nederst på denne side. Det har titlen 'Tvangslukke spørgsmål: Hvad er den bedste løsning?' og omhandler IDG's problemer med udsendelse af mange mails. Brugernes problemer blæser man derimod højt og flot på, og Admin har ikke været aktiv i tråden siden sidst i januar. Han har i øvrigt selv et åbent spørgsmål fra 2009 ... med 201(!) indlæg!

Havde det i sin tid været IDG, der skulle have stået for lanceringen, ville Eksperten aldrig været blevet til noget
Avatar billede _et Praktikant
27. marts 2012 - 08:40 #16
;-)

Jeg takker for hjælpen
Hygge
Avatar billede olebole Juniormester
27. marts 2012 - 13:59 #17
Selvtak - og selvhygge  *o)
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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