Этот ответ ни в коем случае не предназначен для того, чтобы быть "изящным", но я полагаю, что он может попасть в категорию "умных" (Примечание: умные решения не всегда являются «хорошими» решениями)
preg_match_all( "/\"name\";s:\d+:\"(.*?)\"/i", serialize( $arr ), $matches );
print_r( $matches[1] );
Честно говоря, рекурсивная итерация - лучший выбор для ясности, даже если она не очень эффективна или кратка.
<code>$arr = array(
"0" => array(
"Category" => array(
"id" => 49
,"name" => Poster
)
,"Child" => array()
)
,"1" => array(
"Category" => array(
"id" => 48
,"name" => Sticker
)
,"Child" => array()
)
,"2" => array(
"Category" => array(
"id" => 46
,"name" => Hat
)
,"Child" => array()
)
,"3" => array(
"Category" => array(
"id" => 45
,"name" => Hoodie
)
,"Child" => array(
"0" => array(
"id" => 49
,"name" => Poster
)
,"1" => array(
"id" => 48
,"name" => Sticker
)
,"2" => array(
"id" => 40
,"name" => Apparel
)
)
)
);
findNames( $arr, $names );
echo '<pre>';
print_r( $names );
echo '
';
функция findNames ($ source, & $ out)
{
foreach ($ source как $ value)
{
if (isset ($ value ['name']))
{
// Предполагается, что если $ value ['name'] существует, $ value ['id'] также должно существовать
$ out [$ value ['id']] = $ value ['name'];
Продолжить;
}
if (is_array ($ value))
{
findNames ($ value, & $ out);
}
}
}