webForumDet fria alternativet

Hämta värde ur multidimensionell array

PHP

3 svar · 741 visningar · startad av learn

Medlem sedan jan. 20051 130 inlägg
Frågan#1

Lite knep å knåp för den klurige...

Jag har en multidimensionell array som jag vill kunna plocka ut värden ifrån mha en textsträng i formatet "sökväg/till/värdet". Arrayen vet jag alltså inte hur den ser ut i förväg.

Närmare förklaring:


function getValue($array, $path)
{
  // Här händer det...

  return $value;
}

$array = array(
  'ett' => 'Ett'
  'tva' => 'Två'
  'tre' => array(
    'tretva' => array(
      'tretre' => 'Tre'
    )
  )
);

getValue($array, 'tva'); // Två

getValue($array, 'tre/tretva/tretre'); // Tre

getValue($array, 'tre/tretva'); // array('tretre' => 'Tre')

getValue($array, 'fyra'); // null

Hur ska min funktion se ut? Jag lyckas inte...

Medlem sedan mars 20007 896 inlägg
#2

Ett enkelt förfarande kan ju vara;

function array_xpath(&$array, $path) {
    $nodes = explode('/', $path);

    return __helper_array_xpath($array, $nodes);
}
function __helper_array_xpath(&$base, &$nodes) {
    if (($node = array_shift($nodes)) && isset($base[$node])) {
        if (sizeof($nodes) > 0 && is_array($base[$node])) {
            return __helper_array_xpath($base[$node], $nodes);
        } elseif (sizeof($nodes) == 0) {
            return $base[$node];
        }
    }
    return false;
}

$a = array(
	'ett' => 'hej',
	'tva' => array(
		'tre' => 'hopp',
		'fyra' => array(
			'fem' => 'stopp!'
		)
	)
);

echo array_xpath($a, 'tva/fyra/fem'); // stopp!
echo array_xpath($a, 'nio/trettioett'); // [false]

Ett annat förfarande kan ju vara att titta på hur CakePHP har löst det, dom sitter inne på någon typ av XPath-för-arrayer-funktion: http://api.cakephp.org/view_source/set/#line-373

Medlem sedan jan. 20051 130 inlägg
#3

Hmm, tack för ditt tips, får det inte riktigt att funka. Någon som kikat på CakePHP's lösning?

Någon annan som har förslag på hur jag kan lösa detta på ett enkelt sätt? Som det är idag använder jag funktionen eval() vilket inte känns helt rätt...

Medlem sedan mars 20007 896 inlägg
#4

Hur menar du att du inte får det att fungera? Det fungerar enligt spec. från ditt första inlägg.

262 ms totalt · 4 externa anrop · v20260731065814-full.868a69e5
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)