Уже есть ответ с RecursiveIteratorIterator
. Но вот более оптимальное решение, которое избегает использования вложенных циклов :
$iterator = new RecursiveIteratorIterator(
new RecursiveArrayIterator($arr),
RecursiveIteratorIterator::SELF_FIRST
);
$path = [];
$flatArray = [];
foreach ($iterator as $key => $value) {
$path[$iterator->getDepth()] = $key;
if (!is_array($value)) {
$flatArray[
implode('.', array_slice($path, 0, $iterator->getDepth() + 1))
] = $value;
}
}
Здесь необходимо сделать несколько замечаний. Обратите внимание на использование константы RecursiveIteratorIterator::SELF_FIRST
здесь. Это важно, поскольку значение по умолчанию - RecursiveIteratorIterator::LEAVES_ONLY
, которое не позволяет нам получить доступ ко всем ключам. Таким образом, с этим постоянным набором мы начинаем с верхнего уровня массива и углубляемся. Этот подход позволяет нам сохранять историю ключей и подготавливать ключ, когда мы разбираем листы, используя метод RecursiveIteratorIterator::getDepth
.
Вы можете напечатать возврат каретки \ r
, чтобы вернуть курсор в начало строки.
Пример:
public class ProgressDemo {
static void updateProgress(double progressPercentage) {
final int width = 50; // progress bar width in chars
System.out.print("\r[");
int i = 0;
for (; i <= (int)(progressPercentage*width); i++) {
System.out.print(".");
}
for (; i < width; i++) {
System.out.print(" ");
}
System.out.print("]");
}
public static void main(String[] args) {
try {
for (double progressPercentage = 0.0; progressPercentage < 1.0; progressPercentage += 0.01) {
updateProgress(progressPercentage);
Thread.sleep(20);
}
} catch (InterruptedException e) {}
}
}
I don't think there's a built-in capability to do what you're looking for.
There is a library that will do it (JLine).
See this tutorial
Я совершенно уверен, что нет никакого способа изменить что-либо, что консоль уже распечатала, потому что Java считает консоль (стандартную) как PrintStream.
Не знаю ни о чем, встроенном в саму java, но вы можете использовать управляющие коды терминала, чтобы делать такие вещи, как перемещение курсора. Некоторые подробности здесь: http://www.termsys.demon.co.uk/vtansi.htm
Очистите консоль, запустив специальную команду для ОС, а затем распечатайте новый процент