Cesta k hodnotám dle stringu
- altyn
- Člen | 6
Zdravím,
potřeboval bych nakopnout s jedním problémem.
Mám nadefinovány „cesty“ k hodnotám vytaženým z DB, např.
$value = '->name';
$value = '->item_category->name';
Dále mám funkci, která si dle určitého pravidla vybere co všechno potřebuje za hodnoty a ty pak vypíše do excelovského souboru.
$rowCounter = $templateData->startRow;
foreach ($items as $itemId => $item) {
foreach ($templateData->dataList as $column => $data) {
$list->setCellValue($column . $rowCounter, ${'$item' .$data->value});
}
$rowCounter++;
}
Bohužel, stále mi to vyhazuje jen error s tím, že nezná např. $item->item_category->name, ale pokud místo „${‚$item‘ .$data->value}“ vypíšu přímo „$item->item_category->name“, tak s tím nemá problém.
Dokázal by mě někdo nakopnout?
Díky!
- altyn
- Člen | 6
MW napsal(a):
Zkus to nadefinovat bez „->“ a přistupuj k tomu jako k poli:
$item['data']
Jo, tohle mě taky napadlo, ale chtěl bych právě díky cizím klíčům vybírat data i z dalších tabulek, ale pokud to nepůjde budu si tedy muset udělat speciální select, kde si veškeré data vytahám v jednom dotazu a poté k tomu budu přistupovat jako k normálnímu poli jak říkáš.
- matopeto
- Člen | 395
dal by sa na to urobit nejaky helper, splitnes si to podla „->“ a potom prejdes cez for cez tie values a davas $obj = $obj->{$value}
takze nieco take (pisem bez skusania a len tak bez editora ale snad bude napad jasny)
/* $string je daco ako "$item->name->value->othervalue" */
function getValue($string) {
$values = explode("->", $string);
$obj = $$values[0];
foreach($values as $value) {
$obj = $obj->{$value};
}
return $obj
}
Editoval matopeto (10. 2. 2017 12:46)
- altyn
- Člen | 6
matopeto napsal(a):
dal by sa na to urobit nejaky helper, splitnes si to podla „->“ a potom prejdes cez for cez tie values a davas $obj = $obj->{$value}
takze nieco take (pisem bez skusania a len tak bez editora ale snad bude napad jasny)
/* $string je daco ako "$item->name->value->othervalue" */ function getValue($string) { $values = explode("->", $string); $obj = $values[0]; foreach($values as $value) { $obj = $obj->{$value}; } return $obj }
Jo, skvely diky jen doplnim:
// Nastaveni
...
'value' => 'name->...->name',
...
// Volani
$this->getValue($item, $data->value)
// Funkce
public function getValue($item, $string)
{
$values = explode("->", $string);
foreach($values as $value) {
$item = $item->{$value};
}
return $item;
}