Как “сгладить” многомерный массив к простому в PHP?

Я написал свою собственную утилиту, которая помогла мне диагностировать и исправить многие сложные проблемы кодирования. Он доступен как часть библиотеки с открытым исходным кодом. Утилита преобразует любую строку в последовательность Unicode и наоборот. Все, что вам нужно сделать, это:

String codes = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence("Hello world");

И он вернет строку "\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064"

То же самое будет работать для любой строки в любом языке, включая специальные символы. Вот ссылка на статью Java-библиотека с открытым исходным кодом с фильтрацией трассировки стека, конвертер Unicode для анализа Silent String и сравнение версий , в которой объясняется, что такое библиотека и где ее можно получить (доступно как в Maven central [ 113] и github . В статье ищите абзац: «String Unicode converter» .

Поэтому, когда вы читаете вашу String, конвертируйте ее и смотрите, что происходит. Таким образом, вы увидит, какие символы есть, и если информация верна и искажена только неправильной кодировкой или сама информация потеряна. Вы можете легко найти информацию в Интернете, которая предоставляет таблицы сопоставления любого символа с юникодом

73
задан Yi Jiang 3 December 2011 в 03:55
поделиться

4 ответа

использование array_walk_recursive

<?php

$aNonFlat = array(
    1,
    2,
    array(
        3,
        4,
        5,
        array(
            6,
            7
        ),
        8,
        9,
    ),
    10,
    11
);

$objTmp = (object) array('aFlat' => array());

array_walk_recursive($aNonFlat, create_function('&$v, $k, &$t', '$t->aFlat[] = $v;'), $objTmp);

var_dump($objTmp->aFlat);

/*
array(11) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
  [5]=>
  int(6)
  [6]=>
  int(7)
  [7]=>
  int(8)
  [8]=>
  int(9)
  [9]=>
  int(10)
  [10]=>
  int(11)
}
*/

?>

протестированный с PHP, 5.5.9-1ubuntu4.24 (cli) (созданный: 16 марта 2018 12:32:06)

41
ответ дан Luc M 24 November 2019 в 12:06
поделиться

Нерекурсивное решение (но уничтожение порядка):

function flatten($ar) {
    $toflat = array($ar);
    $res = array();

    while (($r = array_shift($toflat)) !== NULL) {
        foreach ($r as $v) {
            if (is_array($v)) {
                $toflat[] = $v;
            } else {
                $res[] = $v;
            }
        }
    }

    return $res;
}
4
ответ дан phihag 24 November 2019 в 12:06
поделиться
function flatten_array($array, $preserve_keys = 0, &$out = array()) {
    # Flatten a multidimensional array to one dimension, optionally preserving keys.
    #
    # $array - the array to flatten
    # $preserve_keys - 0 (default) to not preserve keys, 1 to preserve string keys only, 2 to preserve all keys
    # $out - internal use argument for recursion
    foreach($array as $key => $child)
        if(is_array($child))
            $out = flatten_array($child, $preserve_keys, $out);
        elseif($preserve_keys + is_string($key) > 1)
            $out[$key] = $child;
        else
            $out[] = $child;
    return $out;
}
5
ответ дан chaos 24 November 2019 в 12:06
поделиться
// $array = your multidimensional array

$flat_array = array();

foreach(new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as $k=>$v){

$flat_array[$k] = $v;

}

Также задокументировано: http://www.phpro.org/examples/Flatten-Array.html

19
ответ дан 24 November 2019 в 12:06
поделиться
Другие вопросы по тегам:

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