2013-08-25 3 views
0

У меня есть функция, которая распознает мой $ схему,многомерный поиск массива и заменить не работает

Согласно моему $ схемы [ «заменить»] он заменяет значения.

Моя функция не работает. Не работает так, как ожидалось.

Любой может мне помочь? чтобы завершить мою функцию

$schema = array(
    array(
     'tag' => 'div', 
     'class' => 'lines', 
     'repeat' => array(
      'tag' => 'div', 
      array(
       'tag' => 'span', 
       'style' => 'margin:10px; padding:10px', 
       'key' => 'title', 
      ), 
      'key' => 'subject', 
     ) 
    ) 
); 

$repeat = array('Country Name' => 'Usa', 'City Name' => 'Newyork'); 

function repeat($schema, $repeat){ 
    foreach($schema as $k => $v){ 
     if($k == 'repeat'){ 
      foreach($repeat as $rk => $rv){ 
       $repeat[] = array_replace($schema,array_fill_keys(array_keys($schema, 'title'),$rk)); 
       $repeat[] = array_replace($schema,array_fill_keys(array_keys($schema, 'subject'),$rv)); 
      } 
     } 
    } 
    unset($schema[0]['repeat']); 
    $schema['repeat'] = $repeat; 
    return $schema; 
} 

print_r(repeat($schema, $repeat)); 

ЗАПЛАНИРОВАННЫХ

Array 
(
    [0] => Array 
     (
      [tag] => div 
      [class] => lines 
      [0] => Array 
       (
        [tag] => div 
        [0] => Array 
         (
          [tag] => span 
          [style] => margin:10px; padding:10px 
          [key] => Country Name 
         ) 

        [key] => Usa 
       ) 

      [1] => Array 
       (
        [tag] => div 
        [0] => Array 
         (
          [tag] => span 
          [style] => margin:10px; padding:10px 
          [key] => City Name 
         ) 

        [key] => Newyork 
       ) 

     ) 

) 

Что случилось с моей функцией?

ответ

0

Я прошел через свой код и понял, что это должно быть изменено. Я переписал его, и это работает. Надеюсь, что это поможет:Сделал изменения в коде, и он будет работать для каждого массива $ schema. пожалуйста, проверьте. Это был беспорядок :)

<?php 

$repeat = array('title1'=>'subject1','title2'=>'subject2','title3'=>'subject3','title4'=>'subject4'); 

$schema = array(
       array(
        array(
         array(
          'tag' => 'div', 
          'class' => 'lines', 
          'repeat' => array(
           'tag' => 'div', 
           array(
            'tag' => 'span', 
            'style' => 'margin:10px; padding:10px', 
            'key' => 'title', 
           ), 
           'key' => 'subject', 
          ) 
         ) 
        ), 

        array(
         'tag' => 'section', 
         'id' => 'user-section', 
         'rel' => 'user' 
        ) 
       ) 
); 



function repeat($schema, $repeat) { 

    // Create a duplicate 
    $output = $schema; 

    foreach($schema as $key => $schemaValue) { 

     // Duplicate $schema on a new array 
     $output[$key] = $schemaValue; 

     // Skip none arrays 
     if (!is_array($output[$key])) 
      continue; 

     // Repeat key not in the array: Call recursive function repeat when repeat does not exist 
     if (!array_key_exists('repeat', $output[$key])) { 

      // Recursive call 
      $output[$key] = repeat($output[$key], $repeat); 
     } else { 

      // Repeat key in the array: Parsing the repeat on the schema 
      parseRepeat($repeat, $output[$key]); 

      // Exit foreach after repeat parse is done 
      break; 
     } 

    } 

    return $output; 

} 

function parseRepeat($repeat, &$output) { 
    foreach ($repeat as $title => $subject) { 

      // Adding new repeat Item 
      $repeatItem = $output['repeat']; 
      array_walk_recursive($repeatItem, 'parse_fields', array($subject, $title)); 

      // Adding the item to output array 
      $output[] = $repeatItem; 
     } 

     unset($output['repeat']); 
} 

function parse_fields(&$item, $key, $userdata) 
{ 
    switch ($item) { 
     case 'subject': 
      $item = $userdata[0]; 
      break; 
     case 'title': 
      $item = $userdata[1]; 
      break; 
    } 
} 



// Output result 
echo '<pre>'; 
print_r(repeat($schema, $repeat)); 
+0

Арди Большое спасибо за ваш ответ. Но мой массив не является постоянным. $ schema [0] ['repeat'] может быть как $ schema [0] [0] ['repeat']; Я нашел функцию для поиска ключа, но я не мог найти способ заменить. Можете ли вы это сделать? http://www.php.net/manual/en/function.array-search.php#109720 –

+0

Я внесла изменения в код. Теперь он работает независимо от структуры массива. – Ardi

+0

Спасибо ardi, это хорошая работа. –

0

Я думаю, что проблема заключается в следующем:

'repeat' => array('tag' => 'div',array('tag' => 'span', 'style' => 'margin:10px; padding:10px', 'key' => 'title',) 


является следующий массив в указанный один ключ или значение?

array( 
     'tag' => 'span', 
     'style' => 'margin:10px; padding:10px', 
     'key' => 'title', 
    ) 
+0

У меня есть 2 переменные (1 - название страны 2 - США) Название mustbe заменены названия страны и при условии соблюдения должен заменить Usa –

0

Можно заменить значения с,

// Recursive String Replace - recursive_array_replace(mixed, mixed, array); 
function recursive_array_replace($find, $replace, $array){ 
    if (!is_array($array)){ 
     return str_replace($find, $replace, $array); 
    } 
    $newArray = array(); 
    foreach ($array as $key => $value) { 
     $newArray[$key] = recursive_array_replace($find, $replace, $value); 
    } 
    return $newArray; 
} 
Смежные вопросы