Как сгладить многомерный массив?

IDataErrorInfo не поддерживает множественные ошибки проверки для каждого свойства. Новый интерфейс INotifyDataErrorInfo , который был представлен в .NET Framework 4.5, делает.

Существует пример того, как реализовать это доступно здесь .

Вы можете использовать ItemsControl для отображения сообщений об ошибках. Пожалуйста, посмотрите мой ответ здесь для примера.

238
задан BoltClock 8 January 2012 в 08:41
поделиться

5 ответов

Вы можете использовать стандартную библиотеку PHP (SPL) , чтобы «скрыть» рекурсию.

$a = array(1,2,array(3,4, array(5,6,7), 8), 9);
$it = new RecursiveIteratorIterator(new RecursiveArrayIterator($a));
foreach($it as $v) {
  echo $v, " ";
}

выводит

1 2 3 4 5 6 7 8 9 
263
ответ дан 23 November 2019 в 03:21
поделиться

Это может быть достигнуто при помощи array_walk_recursive

$a = array(1,2,array(3,4, array(5,6,7), 8), 9);
array_walk_recursive($a, function($v) use (&$r){$r[]=$v;});
print_r($r);

Рабочий пример:- https://3v4l.org/FpIrG

0
ответ дан 23 November 2019 в 03:21
поделиться

Использует рекурсию. Надеюсь, увидев, насколько это несложно, ваш страх рекурсии рассеется, как только вы увидите, насколько это несложно.

function flatten($array) {
    if (!is_array($array)) {
        // nothing to do if it's not an array
        return array($array);
    }

    $result = array();
    foreach ($array as $value) {
        // explode the sub-array, and add the parts
        $result = array_merge($result, flatten($value));
    }

    return $result;
}


$arr = array('foo', array('nobody', 'expects', array('another', 'level'), 'the', 'Spanish', 'Inquisition'), 'bar');
echo '<ul>';
foreach (flatten($arr) as $value) {
    echo '<li>', $value, '</li>';
}
echo '<ul>';

Вывод:

<ul><li>foo</li><li>nobody</li><li>expects</li><li>another</li><li>level</li><li>the</li><li>Spanish</li><li>Inquisition</li><li>bar</li><ul>
17
ответ дан 23 November 2019 в 03:21
поделиться

As из PHP 5.3 , самое короткое решение, кажется, array_walk_recursive () с новым синтаксисом замыканий:

function flatten(array $array) {
    $return = array();
    array_walk_recursive($array, function($a) use (&$return) { $return[] = $a; });
    return $return;
}
275
ответ дан 23 November 2019 в 03:21
поделиться

Это решение нерекурсивное. Обратите внимание, что порядок элементов будет несколько смешанным.

function flatten($array) {
    $return = array();
    while(count($array)) {
        $value = array_shift($array);
        if(is_array($value))
            foreach($value as $sub)
                $array[] = $sub;
        else
            $return[] = $value;
    }
    return $return;
}
5
ответ дан 23 November 2019 в 03:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: