Я пытаюсь удалить все пробелы в именах ключей массива, т.е. str_replace ('', '', $ value) (или худший сценарий замены заменяет их символами подчеркивания (_))
и я пытаюсь сделать это на самом глубоком уровне (показанном ниже) моего многомерного массива (поскольку другие уровни / уровни не имеют пробелов (СПАСИБО БОГ!))
[...] [ownPagestoriesbystorytype] => Array ( [type] => pagestoriesbystorytype [object_id] => 12365478954 [metric] => page_stories_by_story_type [end_time] => 1386057600 [period] => 86400 [ownValues] => Array ( [type] => pagestoriesbystorytypemetrics [fan] => 1913 [page post] => 153 [user post] => 24 ) ) [ownPagestorytellersbystorytype] => Array ( [type] => pagestorytellersbystorytype [object_id] => 12365478954 [metric] => page_storytellers_by_story_type [end_time] => 1386057600 [period] => 86400 [ownValues] => Array ( [type] => pagestorytellersbystorytypemetrics [fan] => 1902 [page post] => 137 [user post] => 9 ) ) [...]
Пока мои попытки были бесплодны:
[...] if (is_array($value)) { $keys = str_replace(' ','',array_keys($value)); $values = array_values($value); $value = array_combine($keys,$values); } [...] [...] foreach ($value as $k => $v) { $b = str_replace(' ','',$k); $value[$b] = $value[$k]; unset ($value[$k]); } [...]
Коды выше не работают, однако, если я поставлю print_r (значение $); в конце цикла вы можете ясно видеть, что пробелы удаляются, так или иначе конечный результат заканчивается пробелами (STILL).
Вся петля выглядит так:
for ($i=0;$i<count($results);$i++) { for ($j=0;$j<count($results[$i]);$j++) { foreach($results[$i][$j] as $key => $value) { $typee = ['type' => strtolower(str_replace('_','',$results[$i][$j]['metric']))]; array_insert($results[$i][$j],$typee,0); if (is_array($value)) { $keys = str_replace(' ','',array_keys($value)); $values = array_values($value); $value = array_combine($keys,$values); $type = ['type' => strtolower(str_replace('_','',$results[$i][$j]['metric']))."metrics"]; array_insert($results[$i][$j]['value'],$type,0); $results[$i][$j]['ownValues'] = $results[$i][$j][$key]; unset($results[$i][$j][$key]); } } } }
неfor ($i=0;$i<count($results);$i++) { for ($j=0;$j<count($results[$i]);$j++) { foreach($results[$i][$j] as $key => $value) { $typee = ['type' => strtolower(str_replace('_','',$results[$i][$j]['metric']))]; array_insert($results[$i][$j],$typee,0); if (is_array($value)) { $keys = str_replace(' ','',array_keys($value)); $values = array_values($value); $value = array_combine($keys,$values); $type = ['type' => strtolower(str_replace('_','',$results[$i][$j]['metric']))."metrics"]; array_insert($results[$i][$j]['value'],$type,0); $results[$i][$j]['ownValues'] = $results[$i][$j][$key]; unset($results[$i][$j][$key]); } } } }
И вы можете видеть, как выглядит весь массив здесь:
Как добавить массив к каждому элементу другого массива с моим выбором ключа и значения (в php)?
Какие-либо предложения? 🙂
Это поможет:
function fixArrayKey(&$arr) { $arr = array_combine( array_map( function ($str) { return str_replace(" ", "_", $str); }, array_keys($arr) ), array_values($arr) ); foreach ($arr as $key => $val) { if (is_array($val)) { fixArrayKey($arr[$key]); } } }
Протестировано, как показано ниже:
$data = array ( "key 1" => "abc", "key 2" => array ("sub 1" => "abc", "sub 2" => "def"), "key 3" => "ghi" ); print_r($data); fixArrayKey($data); print_r($data);
Входные данные :
Array ( [key 1] => abc [key 2] => Array ( [sub 1] => abc [sub 2] => def ) [key 3] => ghi )
Вывод:
Array ( [key_1] => abc [key_2] => Array ( [sub_1] => abc [sub_2] => def ) [key_3] => ghi )
function array_stripstuff(&$elem) { if (is_array($elem)) { foreach ($elem as $key=>$value) $elem[str_replace(" ","-",$key)]=$value; } return $elem; } $strippedarray = array_walk_recursive($yourarray,'array_stripstuff');
Там вы идете 🙂
Вы можете передать массив на str_replace
поэтому гораздо проще и проще сделать это:
$my_array = array( 'one 1' => '1', 'two 2' => '2' ); $keys = str_replace( ' ', '', array_keys( $my_array ) ); $results = array_combine( $keys, array_values( $my_array ) );