Last active
December 14, 2016 05:58
-
-
Save errogaht/c30b9dba0d210fcabb7f0461d4ccd02e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
$x = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']; | |
function recursiveCompact($array, $value) | |
{ | |
$arrayDeeper = function (&$arr, $value) use (&$arrayDeeper) { | |
$last = array_pop($arr); | |
$return = [$last => $value]; | |
if (count($arr) > 0) { | |
$return = $arrayDeeper($arr, $return); | |
} | |
return $return; | |
}; | |
$array = array_reverse($array); | |
return $arrayDeeper($array, $value); | |
} | |
print_r(recursiveCompact($x, '')); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Написать функцию которая из этого массива | |
*/ | |
$data1 = [ | |
'parent.child.field' => 1, | |
'parent.child.field2' => 2, | |
'parent2.child.name' => 'test', | |
'parent2.child2.name' => 'test', | |
'parent2.child2.position' => 10, | |
'parent3.child3.position' => 10, | |
]; | |
//сделает такой и наоборот | |
$data = [ | |
'parent' => [ | |
'child' => [ | |
'field' => 1, | |
'field2' => 2, | |
] | |
], | |
'parent2' => [ | |
'child' => [ | |
'name' => 'test' | |
], | |
'child2' => [ | |
'name' => 'test', | |
'position' => 10 | |
] | |
], | |
'parent3' => [ | |
'child3' => [ | |
'position' => 10 | |
] | |
], | |
]; | |
function dotUnDot($var) | |
{ | |
$result = []; | |
/** | |
* Определяет что нужно делать - превращать точки в массив или наоборот | |
* Если возвращает true, то значит на вход подали массив с точками | |
* @return bool | |
*/ | |
$isNeedUnDot = function () use (&$isNeedUnDot, &$var) { | |
$keys = array_keys($var); | |
$firstKey = reset($keys); | |
return strpos($firstKey, '.') !== false; | |
}; | |
/** | |
* Превращает одномерный массив в многомерный, поочереди вкладывая элемент в элемент | |
* @param $arr | |
* @param $value | |
* @return array | |
*/ | |
$arrayDeeper = function (&$arr, $value) use (&$arrayDeeper) { | |
$last = array_pop($arr); | |
$return = [$last => $value]; | |
if (count($arr) > 0) { | |
$return = $arrayDeeper($arr, $return); | |
} | |
return $return; | |
}; | |
/** | |
* Превращает строку с dot нотацией в массив | |
* @param $dots | |
* @param $value | |
* @return array | |
*/ | |
$unDot = function ($dots, $value) use (&$unDot, $arrayDeeper) { | |
$undotted = explode('.', $dots); | |
return $arrayDeeper($undotted, $value); | |
}; | |
/** | |
* Превращает массив в dot нотацию | |
* @param $k | |
* @param $array | |
* @return array | |
*/ | |
$dotify = function ($k, $array) use (&$dotify) { | |
$array2 = []; | |
foreach ($array as $key => $item) { | |
$dotKey = $k . '.' . $key; | |
$array2[$dotKey] = $item; | |
} | |
if (is_array($array2) && is_array(reset($array2))) { | |
$return = []; | |
foreach ($array2 as $key => $v) { | |
$return = array_merge($return, $dotify($key, $v)); | |
} | |
return $return; | |
} | |
return $array2; | |
}; | |
$funcName = $isNeedUnDot() ? $unDot : $dotify; | |
foreach ($var as $k => $array) { | |
$result = array_merge_recursive($result, $funcName($k, $array)); | |
} | |
return $result; | |
} | |
var_dump(dotUnDot($data)); | |
var_dump(dotUnDot($data1)); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment