Autor Zpráva
Enko
Profil
Ahoj,
hledám způsob jak ze dvou polí udělat jedno, sloučením na základě stejných hodnot v obsahu pole, které jsou stejné v obou dvou.
Příklad:
Mám pole 1
[login] => jmeno.prijmeni
[unit] => Array
(
[0] => Hodnota1
[1] => hodnota2
)

pole 2
[login] => Hodnota1
[description] => Description

A chci aby byl výsledek stejný jako například při JOINování SQL tabulek, kdy spojím tabulky na základě společných hodnot z konkrétních sloupců.
Například takto:

Nové pole
[login] => jmeno.prijmeni
[unit] => Array
(
[0] => Hodnota1
)
[description] => Description

Je už na to nějaká vhodná funkce?
Děkuji
Tabetha
Profil
$a1 = array(
   "login" => "neco",
   "unit"  => array(
         "hodnota1", "hodnota2"
    )
);
$a2 = array(
   "login" => "hodnota1",
   "description" => "popis1"
);
$a3 = array(
   "login" => "neco",
   "unit"  => array(
         "hodnota1"
    ),
   "description" => "popis1"
);

chceš docieliť aby to vyzeralo takto?
Enko
Profil
Ano, přesně takto.
Tabetha
Profil
nemal som čas, ale dneska skúsim na to pozrieť. (sťahovanie je hrôza) :) keby niečo, tak skype eodenko ;)
juriad
Profil
<?php

function array_join($left, $right, $condition) {
    $result = array();
    list($lcol, $rcol) = $condition;
    foreach ($left as $lrow) {
        $ll = $lrow[$lcol];
        if (is_null($ll)) {
            continue;
        } else if (is_scalar($ll)) {
            $ll = array($ll);
        } else if (is_array($ll)) {
            # nothing
        } else {
            die ('Wrong type in left');
        }

        foreach ($right as $rrow) {
            $rr = $rrow[$rcol];
            if (is_null($rr)) {
                continue;
            } else if (is_scalar($rr)) {
                $rr = array($rr);
            } else if (is_array($rr)) {
                # nothing
            } else {
                die ('Wrong type in right');
            }

            foreach ($ll as $l) {
                foreach ($rr as $r) {
                    if ($l == $r) {
                        $res = array();
                        foreach ($lrow as $k => $v) {
                            if ($lcol == $k) {
                                continue;
                            }
                            $res[$k] = $v;
                        }
                        foreach ($rrow as $k => $v) {
                            if ($rcol == $k) {
                                continue;
                            }
                            $res[$k] = $v;
                        }
                        $res[$lcol] = $res[$rcol] = $l;
                        $result[] = $res;
                    }
                }
            }
        }
    }
    return $result;
}

$a1 = array(
   "login" => "neco",
   "unit"  => array(
         "hodnota1", "hodnota2"
    )
);
$a2 = array(
   "login" => "hodnota1",
   "description" => "popis1"
);

var_dump(array_join(array($a1), array($a2), array("unit", "login")));

array(1) {
  [0]=>
  array(3) {
    ["login"]=>
    string(8) "hodnota1"
    ["description"]=>
    string(6) "popis1"
    ["unit"]=>
    string(8) "hodnota1"
  }
}

Něco jsem nastřelil. V SQL řádek nesmí obsahovat pole, ale pokusil jsem se to nějak rozumně implementovat; trochu se liší od toho tvého, protože mi to přijde nekonzistentní. Moje funkce joinuje tabulky, ne jen řádky, to je důvod, proč ve výsledeku je o jedno pole více. V případě, že sloupce, podle kterých se joinuje obsahují pole, tak se prostě zkusí všechny možnosti.
Enko
Profil
Ano, děkuji :-)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: