Нужна помощь PHP обработка многомерного массива. Есть функция которая обрабатывает один массив по регулярному выражению! Код (Text): if(preg_match_all("/\[d-(.*?)\|(.*?)\]/", $text, $temp)) { $string = ''; foreach($temp[1] as $key => $item) { $string[$key] = $data['new'][$item][$temp[2][$key]] ?? ''; } $text = str_replace($temp[0], $string, $text); } return $text; Нужно чтобы обрабатывался массив с множественным вложенностью [arr][arr][arr][arr][arr][arr][arr][arr][arr]!
ммм. Извини на коде не опишу, потому что я его не совсем правильно понял. Но суть примерно такая. У тебя есть функция в которую передаешь массив, к примеру mnog_array($array, $all_result) В нее ты передает свой многомерный массив. И такая вещь, в ней есть цикл который проходит массив и сразу же обрабатывает твои элементы, если же в элементе есть еще массивы ты запихаешь этот элемент с массивом в свою функцию, которая опять все это обрабатывает и гоняет. И походу действия запихиваешь это все в $all_result и на выходе получишь массив с ответами по многомерному массиву. Я вообще плохо объясняю по этому дам маленький пример рекурсивной функции с многомерными массивами. Но хочу уточнить. Что если ты с рекурсией не знаком то сразу ты это точно не поймешь. Это нужно будет все хорошенечко подучить и тогда копать дальше как это реализовать. PHP: <?php $arr =Array( 254362=>Array(254370, 254363),254363=>Array(254369 ), 254357=>Array(254362,254359),254359=>Array(254360), 254369=>Array(253000),Array(254357) ); var_dump(get_childs($arr,254362)); function get_childs(&$array, $id){ static $childs=[]; static $allkey=[]; if(!array_key_exists($id,$array))returnfalse; foreach($array[$id]as $value){ $childs[$id]= $array[$id]; if(!in_array($value,$allkey)){ $allkey[]=$value; get_childs($array, $value); } } return $childs; } ?>
PHP: $arr = [1,2=>[3,4=>[5,6,7=>[8,9]]]]; function test_print($item, $key) { echo $item + 2 ."\n"; } array_walk_recursive($arr, 'test_print'); Код (Text): 3 5 7 8 10 11
@[vs] ну а зачем рекурсия если можно сразу применить пользовательскую функцию к каждому элементу массива, или я не правильно понял что нужно автору?
@abrdabr функция array_map не обойдет вложенные элементы. Придется делать рекурсивную пользовательскую функцию. Идеально подходит array_walk_recursive из поста @alexblack
Если я правильно понял смысл вопроса, то надо вывести найденые шаблоны в каждый массив. Идея такая PHP: <?php if(preg_match_all("/\[d-(.*?)\|(.*?)\]/", $text, $temp)) { foreach($temp as $str) { // разбиваем строку массива с помощью разделителя и заносим её в другой массив $line = explode(" ", $str); }; }; //вывод массива for ($i = 0; $i < count($line); $i++) { echo $line[$i], "<br />"; }; ?> Может поможет с реализацией?
Код (Text): if(preg_match_all("/\[d-(.*?)\|(.*?)\]/", $text, $temp)) { $string = ''; foreach($temp[1] as $key => $item) { $string[$key] = $data['new'][$item][$temp[2][$key]] ?? ''; } $text = str_replace($temp[0], $string, $text); } return $text; Обрабатывает массив [array][array][array] А нужно неизвестное количество [array]
Так для этого мы тебе и з самого начала сказали использовать рекурсию. Пожалуйста почитай что это такое. А когда усвоишь материал то поймешь что это то что тебе нужно.
вот самая примитивная рекурсия PHP: class Recurse { public $res = 0; public function Rec($array) { if (is_array($array)) { foreach ($array as $ar) $this->Rec($ar) ; // это и есть рекурсивный запуск. }else { $this->res += $array; // вот тут делаем то что нужно с каждым элементом массива. в данном случае просто вычисяется сумма всех элементов } return $this->res; } } $arr = array(array(1,4,6),array(1,5,6),array(8,4,6),array(1,4,16),array(21,121,43,45,4,6),array(1,4,6)); $cl = new Recurse(); $tmp = $cl->Rec($arr);
Я думаю нужно что-то типа Код (Text): public static function trace($text , $data = null) { if(preg_match_all("/\[d-(.*?)\|(.*?)\]/", $text, $temp)) { $string = ''; foreach($temp[1] as $key => $item) { if (is_array($item)) { trace($item, $text); } else { $string[$key] = $data['config'][$item][$temp[2][$key]] ?? ''; } } $text = str_replace($temp[0], $string, $text); } return $text; } Только вот беда не работает!
тебе надо проверку на is_array надо дополнительно вставить вставить до if вернее перенести - когда срабатывает if - это значит элемент массива
тип того PHP: public static function trace($text , $data = null) { if (is_array($text)) foreach ($text as $t) trace($t, $text); else if(preg_match_all("/\[d-(.*?)\|(.*?)\]/", $text, $temp)) { $string = ''; foreach($temp[1] as $key => $item) { $string[$key] = $data['config'][$item][$temp[2][$key]] ?? ''; } $text = str_replace($temp[0], $string, $text); } return $text; } но что мешает воспользоваться тем что я предложил? в 13-ю строку вставляешь свою обработку if(preg_match_all ..... только правильно надо нарисовать $this->res
Правильное решение! Код (Text): if(preg_match_all("/\[d-(.*?)\]/", $text, $temp)) { if(!isset($data['config'])) $data['config'] = Config::instance()->config; $string = ''; foreach($temp[1] as $key => $item) { $arr = explode("|", $item); $tmp = null; foreach($arr as $v) { if(isset($tmp)) { if(!isset($tmp[$v])) continue; $tmp = $tmp[$v]; } else { if(!isset($data['config'][$v])) continue; $tmp = $data['config'][$v]; } } $string[$key] = $tmp ?? ''; } $text = str_replace($temp[0], $string, $text); } return $text;