Я написал свою собственную утилиту, которая помогла мне диагностировать и исправить многие сложные проблемы кодирования. Он доступен как часть библиотеки с открытым исходным кодом. Утилита преобразует любую строку в последовательность 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, конвертируйте ее и смотрите, что происходит. Таким образом, вы увидит, какие символы есть, и если информация верна и искажена только неправильной кодировкой или сама информация потеряна. Вы можете легко найти информацию в Интернете, которая предоставляет таблицы сопоставления любого символа с юникодом
использование 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)
Нерекурсивное решение (но уничтожение порядка):
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;
}
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;
}
// $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