Я пытаюсь найти способ вернуть значение родительского ключа массива.
Например, из приведенного ниже массива я хотел бы узнать ключ родителя, где $ array ['id'] == "0002". Родительский ключ очевиден, потому что он определен здесь (это будут «продукты»), но обычно он будет динамичным, следовательно, проблема. Идентификатор «id» и значение «id» известны.
[0] => Array ( [data] => [id] => 0000 [name] => Swirl [categories] => Array ( [0] => Array ( [id] => 0001 [name] => Whirl [products] => Array ( [0] => Array ( [id] => 0002 [filename] => 1.jpg ) [1] => Array ( [id] => 0003 [filename] => 2.jpg ) ) ) ) )
Немного грубой рекурсии, но она должна работать:
function find_parent($array, $needle, $parent = null) { foreach ($array as $key => $value) { if (is_array($value)) { $pass = $parent; if (is_string($key)) { $pass = $key; } $found = find_parent($value, $needle, $pass); if ($found !== false) { return $found; } } else if ($key === 'id' && $value === $needle) { return $parent; } } return false; } $parentkey = find_parent($array, '0002');
Поскольку у вас есть древовидная структура, BFS или DFS могут это сделать. Поскольку структура является переменной, рекурсивное решение будет работать хорошо. Просто верните часовое при обнаружении значения, а затем верните ключ в вызывающем.
function array_to_xml($array, $rootElement = null, $xml = null) { $_xml = $xml; if ($_xml === null) { $_xml = new SimpleXMLElement($rootElement !== null ? $rootElement : '<root/>'); } $has_int_key = 0; foreach ($array as $k => $v) { if (is_array($v)) { if(is_int($k)){ $this->array_to_xml($v, $k, $_xml->addChild($rootElement)); } else { foreach($v as $key=>$value) { if(is_int($key)) $has_int_key = 1; } if ($has_int_key) { $this->array_to_xml($v, $k, $_xml); } else { $this->array_to_xml($v, $k, $_xml->addChild($k)); } } } else { $_xml->addChild($k, $v); } } return $_xml->asXML(); }