2015-02-06 6 views
0

Предположим, у меня есть два массива, один из которых мне нужен, другой - массив, с которым я хочу протестировать.PHP - Зацикливание через смешанный массив

В массиве ключей, которые мне нужны, каждая клавиша может иметь значение, которое представляет собой массив ключей, которые мне нужны, и так далее.

Вот функция до сих пор:

static function keys_exist_in_array(Array $required_keys, Array $values_array, &$error) 
{  
    foreach($required_keys as $key) 
    { 
     // Check required key is set in the values array 
     //   
     if (! isset($values_array[$key])) 
     { 
      // Required key is not set in the values array, set error and return 
      // 
      $error = new Error(); 

      return false; 
     } 

     // Check the value is an array and perform function on its elements 
     // 
     if (is_array($values_array[$key])) 
     { 
      Static::keys_exist_in_array($required_keys[$key], $values_array[$key], $error); 
     } 

     return true; 
    } 
} 

Моя проблема заключается в том, что массив, который я хочу представить $required_keys МОЖЕТ выглядеть следующим образом:

$required_keys = array(
    ‘key1’, 
    ‘key2’, 
    ‘key3’, 
    ‘key4’ = array(
     ‘key1’, 
     ‘key2’, 
     ‘key3’ = array(
      ‘key1’ 
     ) 
    ) 
); 

Очевидно, что проблема здесь заключается в том, что foreach только находит каждый ключ, например 'Key4', а не значения без их собственного значения, например. 'Key1', 'key2', 'key3'.

Но если я пройду цикл со стандартным циклом, я получаю только значения, key1, key2, key3.

Что может быть лучше?

Благодаря

+1

Когда цикл проверки, если значение является массивом, и если это так повторный вызов функции внутри цикла и передать значение (массив). – AbraCadaver

+0

проверьте тип элемента, если это массив, запишите на этот элемент! – taesu

+0

http://stackoverflow.com/questions/2648968/what-is-a-recursive-function-in-php – Capsule

ответ

1

Несколько проблем:

$key является элемент массива, а не ключ, так что вы

Вы не должны return false как только вы видите, не соответствующий элемент, потому что в массиве может быть соответствующий элемент. Вместо этого вы должны return true, как только найдете совпадение. Когда вы найдете совпадение, вам не нужно продолжать поиск.

Сначала необходимо выполнить тест isarray(), потому что вы получите сообщение об ошибке, если $key - это массив, и вы пытаетесь использовать $values_array[$key]. И это должно быть isarray($key), а не isarray($values_array[$key]).

Вам необходимо проверить значение рекурсивного вызова. Если это удастся, вы можете немедленно вернуться.

Вы должны только return false после того, как закончите цикл и ничего не найдете.

static function keys_exist_in_array(Array $required_keys, Array $values_array, &$error) 
{  
    foreach($required_keys as $key) 
    { 
     // Check the value is an array and perform function on its elements 
     // 
     if (is_array($key)) 
     { 
      $result = Static::keys_exist_in_array($required_keys[$key], $values_array[$key], $error); 
      if ($result) { 
       return true; 
      } 
     }    
     // Check required key is set in the values array 
     //   
     elseif (isset($values_array[$key])) 
     { 
      return true; 
     } 
    } 
    $error = new Error(); 
    return false; 
} 
0

Возвращение лжи здесь является правильным действием, если требуется, чтобы существовать ВСЕ $ required_keys, потому что вы хотите, чтобы перестать смотреть, как только он находит пропавший ключ.

static function keys_exist_in_array(Array $required_keys, Array $values_array, &$error) 
{  
    foreach($required_keys as $key=>$value) 
    { 
     //check if this value is an array 
     if (is_array($value)) 
     { 
      if (!array_key_exists($key, $values_array) 
       || !Static::keys_exist_in_array($value, $values_array[$key], $error);){ 
       $error = new Error(); 
       return false; 
      } 


     } 

     // Since this value is not an array, it actually represents a 
     // key we need in the values array, so check if it is set 
     // in the values array  
     elseif (!array_key_exists($value, $values_array)) 
     { 
      // Required key is not set in the values array, set error and return 
      $error = new Error(); 
      return false; 
     } 


    } 
    //All elements have been found, return true 
    return true; 
} 
0

Преобразование массива в массив ключей => с пустым значением для «ключей», которые не имеют значения.

$arr = [ 
    'a', 
    'b' => ['foo' => 1, 'bar' => 'X'], 
    'c' => ['baz' => 'Z'], 
    'd' 
]; 

$res = []; 
$keys = array_keys($arr); 
$vals = array_values($arr); 
foreach ($vals as $i => $v) { 
    if (is_array($v)) { 
     $res[$keys[$i]] = $v; 
    } else { 
     $res[$v] = []; 
    } 
} 

print_r($res); 

Результат:

Array 
(
    [a] => Array 
     (
     ) 

    [b] => Array 
     (
      [foo] => 1 
      [bar] => X 
     ) 

    [c] => Array 
     (
      [baz] => Z 
     ) 

    [d] => Array 
     (
     ) 
) 
Смежные вопросы