PHP - Как определить количество родителей дочернего массива? - PullRequest
1 голос
/ 04 февраля 2011

Я не так силен с массивами, но мне нужно определить, как подсчитать количество родителей в дочернем массиве, чтобы определить отступ для его отображения в качестве опции в SELECT.

Так, если у меня есть этот массив:

array(
      'World'=>array(
            'North America'=>array(
                  'Canada'=>array(
                       'City'=>'Toronto'
                   )
            )
      )
);

Как бы я определил, сколько у родителей 'City', чтобы перевести это число в число пробелов, которые я хочу использовать в качестве отступа?

Спасибо за любую помощь.

РЕДАКТИРОВАТЬ: Давайте посмотрим, смогу ли я объяснить себя лучше:

У меня есть этот код, который я использую для создания списка опцийдля SELECT:

function toOptions($array) {

    foreach ($array as $key=>$value) {
        $html .= "<option value=\"" . $key . "\" >";

        $html .=  $value['title'];

        $html .= "</option>";

        if (array_key_exists('children', $value)) {
            $html .= toOptions($value['children']);
        }

    }

    return $html;

}

print toOptions($list);

Итак, я пытаюсь определить, как получить количество родителей, чтобы добавить пробелы перед заголовком в этой строке:

$html .=  $value['title'];

Мне нравится:

$html .= "&nbsp;&nbsp;&nbsp;" . $value['title'];

Но я не уверен, как определить, сколько пробелов добавить.

Надеюсь, это более понятно.

Спасибо за любую помощь, такдалеко.

Ответы [ 4 ]

2 голосов
/ 04 февраля 2011
$x = array(
      'World'=>array(
            'North America'=>array(
                  'Canada'=>array(
                       'City'=>'Toronto'
                   )
            )
      )
);

// This function do something with the key you've found in the array
function visit($name, $depth)
{
    echo $name . ' has ' . $depth . ' parents.'; 
}

// This function visits all the contents aff $array
function find_recursive($array, $depth = 0)
{
    if (is_array($array)) {
        foreach ($array as $k => $value) {
            visit($k, $depth + 1);
            find_recursive($array, $depth + 1);
        }
    }
}

Для посещения:

find_recursive($x);
1 голос
/ 04 февраля 2011

Поскольку вы уже используете рекурсивную функцию для отображения этих данных, вы можете просто расширить свою функцию.Нет необходимости обходить массив чаще, чем один раз:

function getWhitespaces($count) {
    $result = '';
    while($count--) {
        $result .= '$nbsp;';
    }
    return $result;
}


function toOptions($array, $level=0) {

    foreach ($array as $key=>$value) {
        $html .= "<option value=\"" . $key . "\" >";

        $html .=  getWhitespaces($level) + $value['title'];

        $html .= "</option>";

        if (array_key_exists('children', $value)) {
            $html .= toOptions($value['children'], $level + 1);
        }

    }

    return $html;

}

print toOptions($list);
1 голос
/ 04 февраля 2011

Хорошо.Сверх того, с чем вы имеете дело, это многомерный массив.

Вы можете запустить подсчет w / foreach на каждом уровне массива и использовать число, возвращаемое +1, для каждого уровня, через который проходит цикл foreach..

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

0 голосов
/ 04 февраля 2011

Попробуйте следующее .. Ваше решение кричит о рекурсии в моей голове. Это немного некрасиво, но, похоже, работает

$totraverse = array(
    'Moon' => array(
        'Dark Side' => "Death Valley"
    ),
    'Halley Commet' => "Solar System",
    'World' => array(
        'North America' => array(
            'Canada' => array(
                'City' => 'Toronto'
            )
        ), 'South America' => array(
            'Argentina' => array(
                'City' => 'Toronto'
            )
        )
    )
);


function traverse($totraverse_, $path="", $count=0) {
    global $array;
    // echo count($totraverse_) . " count\n";
    if (!is_array($totraverse_)) {
        echo "returning $path and  $key\n";
        return array($path, $count);
    } else {
        foreach ($totraverse_ as $key => $val) {

            echo "assting $path and  $key\n";
            $result = traverse($val, $path . "/" . $key, $count + 1);
            if($result){
                $array[]=$result;
            }
        }
    }
    echo false;
}

$array = array();
traverse($totraverse);

foreach($array as $item){
    echo "{$item[0]}--->{$item[1]}\n";
}
...