Halmazműveletek PHP összetett tömbökkel

Címkék
Halmazműveletek PHP összetett tömbökkel
2010-03-07T11:16:12+01:00
2010-03-11T19:26:34+01:00
2022-11-17T01:25:33+01:00
gq1uh2
Hali!

minta_1 és minta_2 összetett tömbök a lenti kódban szereplő struktúra szerint.

A minta_1-el összehasonlítjuk minta_2-t. Az alábbiakat szeretném megtudni:

melyek azok az array_n értékek, amelyek...

- mindkét mintában szerepelnek (metszet)
- csak a minta_1 -ben szerepelnek (minta_1 \ minta_2)

array_diff stb. függvényekkel próbálkozom, de több dimenziós tömbbel egyelőre nem sikerült elvégeznem ezeket a műveleteket..


<?php $array_1=array(0 => "abc",1 => "aab",2 => "aba",3 => "aab"); $array_2=array(0 => "acb", 1 => "adc",2 => "aba",3 => "aab"); $array_3=array(0 => "cab", 1 => "dac",2 => "aaa",3 => "aba"); $array_4=array(0 => "ccb", 1 => "dac",2 => "aaa",3 => "aba"); $minta_1=array($array_1,$array_2,$array_4); $minta_2=array($array_2,$array_3,$array_4); $diffi = array_diff($minta_1,$minta_2); echo json_encode($diffi); ?>
Mutasd a teljes hozzászólást!
Ha megnézed amit legutóljára írtam neked, az egy az egyben azt a kimenetet adja, amit kértél.
Mutasd a teljes hozzászólást!

  • Első komment <
    Mutasd a teljes hozzászólást!
  • üres tömböt ad vissza
    Mutasd a teljes hozzászólást!
  • Így?

    $a1=array(); $a2=array(); foreach($minta_1 as $t1){ foreach($t1 as $a){ if(!in_array($a,$a1)) $a1[]=$a; } } foreach($minta_2 as $t2){ foreach($t2 as $b){ if(!in_array($b,$a2)) $a2[]=$b; } } print_r($a1); print "<br/>--------------------------------------<br/>"; print_r($a2); print "<br/>--------------------------------------<br/>"; $diff=array_diff($a1,$a2); $metszet=array_intersect($a1,$a2); print_r($diff); print "<br/>--------------------------------------<br/>"; print_r($metszet);
    Mutasd a teljes hozzászólást!
  • Sajnos ez sem jó, kicsit módosítottam a kódon, hogy könnyebben szemléltethető legyen, mi a hiba. A kimeneteken a tömbök JSON reprezentációját íratom ki:

    <?php $array_1=array("login" => "111","jelszo" => "pw1","admin" =>"i"); $array_2=array("login" => "222", "jelszo" => "pw2","admin" =>"i"); $array_3=array("login" => "333", "jelszo" => "pw3","admin" =>"n"); $array_4=array("login" => "444", "jelszo" => "pw4","admin" =>"i"); $minta_1=array($array_1,$array_2,$array_4,$array_3); $minta_2=array($array_1,$array_2,$array_3); $a1=array(); $a2=array(); foreach($minta_1 as $t1){ foreach($t1 as $a){ if(!in_array($a,$a1)) $a1[]=$a; } } foreach($minta_2 as $t2){ foreach($t2 as $b){ if(!in_array($b,$a2)) $a2[]=$b; } } print "<br/>--------------------------------------a1:<br/>"; echo json_encode($a1); print "<br/>--------------------------------------a2:<br/>"; echo json_encode($a2); print "<br/>--------------------------------------diff:<br/>"; $diff=array_diff($a1,$a2); $metszet=array_intersect($a1,$a2); echo json_encode($diff); print "<br/>--------------------------------------metszet:<br/>"; echo json_encode($metszet); ?>


    A kimenet az általad írt kódra:


    --------------------------------------a1:
    ["111","pw1","i","222","pw2","444","pw4","333","pw3","n"]
    --------------------------------------a2:
    ["111","pw1","i","222","pw2","333","pw3","n"]
    --------------------------------------diff:
    {"5":"444","6":"pw4"}
    --------------------------------------metszet:
    {"0":"111","1":"pw1","2":"i","3":"222","4":"pw2","7":"333","8":"pw3","9":"n"}


    A kódban készített a1 és a2 tömbök nem egyenértékűek a $minta_1=array($array_1,$array_2,$array_4); tömbbel. A problémám nekem is épp az, hogy több dimenziós tömböket kell összehasonlítani.

    A probléma: a többdimenziós tömb elemeivel végzi a halmazműveleteket, nem az $array_n értékekkel.

    A kimenet helyesen így kéne, hogy kinézzen:

    --------------------------------------a1:
    {"login":"111","jelszo":"pw1","admin":"i"},{"login":"222","jelszo":"pw2","admin":"i"},{"login":"444","jelszo":"pw4","admin":"i"},{"login":"333","jelszo":"pw3","admin":"n"}]
    --------------------------------------a2:
    [{"login":"111","jelszo":"pw1","admin":"i"},{"login":"222","jelszo":"pw2","admin":"i"},{"login":"333","jelszo":"pw3","admin":"n"}]
    --------------------------------------diff:
    {"login":"444","jelszo":"pw4","admin":"i"}
    --------------------------------------metszet:
    [{"login":"111","jelszo":"pw1","admin":"i"},{"login":"222","jelszo":"pw2","admin":"i"},{"login":"333","jelszo":"pw3","admin":"n"}]
    Mutasd a teljes hozzászólást!
  • Szerk:
    $array_1=array("login" => "111","jelszo" => "pw1","admin" =>"i"); $array_2=array("login" => "222", "jelszo" => "pw2","admin" =>"i"); $array_3=array("login" => "333", "jelszo" => "pw3","admin" =>"n"); $array_4=array("login" => "444", "jelszo" => "pw4","admin" =>"i"); $minta_1=array($array_1,$array_2,$array_4,$array_3); $minta_2=array($array_1,$array_2,$array_3); $metszet=array(); $dif=array(); foreach($minta_1 as $a){ if(in_array($a, $minta_2)){ $metszet[]=$a; } elseif(!in_array($a,$minta_2)){ $dif[]=$a; } } echo json_encode($dif);
    Mutasd a teljes hozzászólást!
  • Ha ehelyett:
    $minta_1=array($array_1,$array_2,$array_4); $minta_2=array($array_2,$array_3,$array_4);
    Ezt írnád:
    $minta_1=array_merge($array_1,$array_2,$array_4); $minta_2=array_merge($array_2,$array_3,$array_4);

    Akkor kapnál két halmazt, amire már menni fog az array_diff, mert csak 1 dimenziósak.

    Egyébként ehelyett:
    $array_1=array(0 => "abc",1 => "aab",2 => "aba",3 => "aab");
    írhatod ezt:
    $array_1=array("abc", "aab", "aba", "aab");

    Ha mindenképp kétdimenziós tömbökre akarsz megoldást, akkor kétdimenziósból az összes értéket bele lehet rakni egydimenziósba:
    $halmaz_1=array(); foreach ($minta_1 as $row) foreach ($row as $value) $halmaz_1[] = $value;

    Ekkor a $halmaz_1 -ben benne lesz a minta1-ből az összes érték, és használhatod az array_diff-et, pl így:
    $diffi = array_diff($halmaz_1, $halmaz_2);
    Ha csak a különböző értékeket akarod látni, akkor:
    $diffi = array_unique(array_diff($halmaz_1, $halmaz_2));

    Metszetre (mindkét mintában szerepel), használd az array_diff helyett az array_intersect fv-t.
    Mutasd a teljes hozzászólást!
  • Na én ezt a hozzászólásodat most olvastam. Megoldódott már a problémád, mert rég nem írtál ide?
    Mutasd a teljes hozzászólást!
  • Engem is érdekel
    Mutasd a teljes hozzászólást!
  • Sziasztok!


    Elegáns megoldásom továbbra sincs... A lenti mókolással közelítek a célhoz, de még bugos.


    foreach($tabla as $m1){ $e=0; $a=0; foreach($adatbazis as $m2){ if($m1==$m2){ foreach($tabla as $m1_t) if($m2==$m1_t) $e++; foreach($adatbazis as $m2_t) if($m2==$m2_t) $a++; } } if($e==0) array_push($insert,$m1); else if($e>1){ if(!in_array(array(($e-$a),$m1), $insert_vegy)){ array_push($insert_vegy,array(($e-$a),$m1)); } } } foreach($adatbazis as $m2){ $e=0; $a=0; foreach($tabla as $m1){ if($m1==$m2) { foreach($adatbazis as $m1_t) if($m2==$m1_t) $e++; foreach($tabla as $m2_t) if($m2==$m2_t) $a++; } } if($e==0) array_push($delete,$m2); else if($e>1){ if(!in_array(array(($e-$a),$m1), $delete_vegy)){ array_push($delete_vegy,array(($e-$a),$m1)); } } } echo "\nDELETE: \n".json_encode($delete); echo "\n\nINSERT: \n".json_encode($insert)."\n\n";
    Mutasd a teljes hozzászólást!
  • Ha megnézed amit legutóljára írtam neked, az egy az egyben azt a kimenetet adja, amit kértél.
    Mutasd a teljes hozzászólást!
Címkék
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd