Управление структурой многомерного массива - PullRequest
0 голосов
/ 21 апреля 2009

Это на самом деле проблема, которую я уже решил, но я подозреваю, что может быть лучшее решение. У меня есть вложенный массив, который в основном представляет список всех узлов из дерева категорий (в произвольном порядке):

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()
    )
)

Вы заметите, что $node['Child'] - это пустой массив во всех случаях. Это потому, что я уже использовал array_filter() для фильтрации всех неконечных узлов. Тем не менее, в конечном итоге я хочу иметь одномерный массив листовых узлов, подобный этому:

Array(
    [49] => Poster
    [48] => Sticker
    [46] => Hat
    [45] => Hoodie
)

Итак, что было бы наиболее элегантным способом преобразования первого массива во второй массив?

При желании вы также можете начать с массива как листовых, так и не листовых узлов, а также попытаться сократить массив и реструктурировать его. Примером не-листового узла будет что-то вроде:

[7] => Array(
    [Category] => Array(
        [id] => 36
        [name] => Merch
    )
    [Child] => Array(
        [0] => Array(
            [id] => 49
            [name] => Poster
        )
        [1] => Array(
            [id] => 48
            [name] => Sticker
        )
        [2] => Array(
            [id] => 40
            [name] => Apparel
        )
    )
)

Наконец, я использую CakePHP, поэтому использование класса CakePHP Set также допустимо.

Ответы [ 2 ]

4 голосов
/ 21 апреля 2009

Элегантный? Определите элегантность. Я думаю, что некоторые люди собираются превратить это в соревнование по гольфу, а не просто делать то, что имеет смысл, и это очевидно для любого, кто позже наткнется на код:

$cats = array();
foreach($categories as $c) {
    $cats[$c['Category']['id']] = $c['Category']['name'];
}

Я подозреваю, что это то, что у вас есть, и в этом случае я предлагаю вам похлопать себя по спине и двигаться дальше.

1 голос
/ 21 апреля 2009

Этот ответ ни в коем случае не предназначен для того, чтобы быть "изящным", но я полагаю, что он может попасть в категорию "умных" (Примечание: умные решения не всегда являются «хорошими» решениями)

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); } } }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...