2014-08-29 2 views
0

У меня есть переменная, входящая в форму, и из-за плохого дизайна оригинальным разработчиком форма будет отправлять значения элемента пустой формы как '' (пустые одинарные кавычки), это наводит хаос с некоторыми запросами, которые мне приходится писать, потому что функции читают их как значения. Я написал функцию для установки любых экземпляров '' в false, главным образом потому, что просто захват, если значение false, не работает. Я переписал функцию рекурсивной, чтобы развернуть ее в вложенные массивы.Рекурсивная функция PHP, не задающая вложенные массивы

function validateVars($vars){ 
    foreach($vars as $k => $v){ 
     is_array($k) ? validateVars($k) : $vars[$k] = ($v == '' ? FALSE : $v); 
    } 
    return $vars; 
} 

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

array(14) { 
    ["title"]=> string(3) "JLR" 
    ["issue"]=> array(3) { 
     ["jobs"]=> string(11) "66055,66056" 
     ["Ids"]=> string(0) "" 
     ["DateRange"]=> string(0) "" } 
    ["article"]=> array(2) { 
     ["Jobs"]=> string(0) "" 
     ["Ids"]=> string(0) "" } 
    ["issueDateFields"]=> string(11) "DateCreated" 
    ["articleDateRange"]=> bool(false) 
    ["articleDateFields"]=> string(11) "DateCreated" 
    ["AdsJobs"]=> bool(false) 
    ["FMBMJobs"]=> bool(false) 
    ["AdsIds"]=> bool(false) 
    ["FMBMIds"]=> bool(false) 
    ["adsDateRange"]=> bool(false) 
    ["adsDateFields"]=> string(11) "DateCreated" 
    ["fmbmDateRange"]=> bool(false) 
    ["fmbmssueDateFields"]=> string(11) "DateCreated" 
} 
+0

Эта одна линия является doozy. –

ответ

2
  1. Вы тестируете вложенное значение массива ключа и нет, и
  2. вы делаете ничего с возвращаемым значением.

Это должно быть так:

function validateVars(array $vars){ 
    foreach ($vars as &$value) { 
     if (is_array($value)) { 
      $value = validateVars($value); 
     } else if ($value == '') { 
      $value = false; 
     } 
    } 
    return $vars; 
} 

Если вы хотите остроты, по крайней мере, сделать это правильно. ;)

function validateVars(array $vars) { 
    return array_map(
     function ($v) { 
      return is_array($v) ? validateVars($v) : ($v == '' ? false : $v); 
     }, 
     $vars 
    ); 
} 
+0

отлично, спасибо! Не могу поверить, что я пропустил это. – VikingBlooded

+0

К сожалению, я должен быть очень осторожным в отношении того, как я реализую вещи, как только я это сделаю, это будет поддерживаться людьми с еще меньшим знанием PHP и механизма БД, чем я. Таким образом, это должно быть чем-то, что они могут обернуть вокруг себя. – VikingBlooded

+1

@VikingBlooded - Затем оставайтесь далеко, далеко от тройных (особенно вложенных тройников). Первая форма * намного, гораздо читабельна *. –

0

Похоже, вы передаете ключ массива в is_array() который всегда будет оценивать ложь.

Кроме того, вы изменяете местный $ варов переменным, но не с помощью выхода:

$vars = [];//this is your array 

$vars = validateVars($vars); 

function validateVars($myVars){ 
    foreach($myVars as $k => $v){ 
     is_array($v) ? $myVars[$k] = validateVars($v) : $myVars[$k] = ($v == '' ? FALSE : $v); 
    } 
    return $myVars; 
} 

Что бы изменить свой исходный массив.

+0

к сожалению, не работает. – VikingBlooded

+0

Извините, я немного отредактировал его, чтобы включить вызов функции. Я не тестировал это, но мой ответ похож на deceze – Joao

+0

. Вы не можете использовать такую ​​переменную без импорта, используя ключевое слово 'global' внутри функции, а глобальные переменные сильно обескуражены, особенно для чего-то вроде этого. –

Смежные вопросы