Проверьте наличие двух ключевых значений из сериализованного массива

#php #mysql

Вопрос:

Мы использовали приведенный ниже код для создания отчета о ходе работы для пользователей. Он проверяет массив для каждого пользователя в разделе _usermeta. Это работало до сих пор, потому что плагин, который создает данные, добавит ценность уроку только в том случае, если он будет завершен. Теперь он добавляет значение независимо и имеет второе значение для того, было ли оно завершено или нет. Есть какие-нибудь идеи о том, как это сделать?

 /* php for the page itself */   foreach($usersemail['users'] as $userdata){    $dtd= get_user_meta($userdata['user_id'] ,'_sfwd-course_progress',true);    ?gt;  lt;trgt;lt;tdgt;lt;?php echo get_user_meta($userdata['user_id'],'first_name',true).' '.get_user_meta($userdata['user_id'],'last_name',true); ?gt;lt;/tdgt;   lt;?php   foreach($dtd as $dt){  if(array_key_exists('21414',$dt['lessons'])){  $lession_complete= false;   echo "lt;tdgt;completed lt;/tdgt;";   }else{  echo "lt;tdgt; lt;/tdgt;";   }     if(array_key_exists('21416',$dt['lessons'])){  $lession_complete= false;   echo "lt;tdgt;completed lt;/tdgt;";   }else{  echo "lt;tdgt; lt;/tdgt;";   }   if(array_key_exists('21418',$dt['lessons'])){  $lession_complete= true;   echo "lt;tdgt;completed lt;/tdgt;";   }else{  echo "lt;tdgt; lt;/tdgt;";   }   
 /*example of table from _usermeta */  a:1:{i:21126;a:6:{s:7:"lessons";a:5:{i:21412;i:1;i:21414;i:0;i:21416;i:1;i:21418;i:1;i:21420;i:1;}s:6:"topics";a:5:{i:21412;a:0:{}i:21414;a:0:{}i:21416;a:0:{}i:21418;a:0:{}i:21420;a:0:{}}s:9:"completed";i:5;s:5:"total";i:5;s:7:"last_id";i:21420;s:6:"status";s:11:"in_progress";}}  

Используя урок 21416 в качестве примера: мне нужно, чтобы он повторил «завершено», если и урок найден (21416), и если следующее за ним значение «i:1». По умолчанию используется пустой td, если значение равно i:0.

Заранее спасибо!

Ответ №1:

Если у вас уже есть значение in lessons 1 , которое, как вы знаете, завершено, вам просто нужно изменить свой цикл следующим образом::

 foreach($dtd as $dt){  foreach($dt['lessons'] as $lesson_id =gt; $value) {  if($value == 1){  $lession_complete= false;   echo "lt;tdgt;completed lt;/tdgt;";   } else {  echo "lt;tdgt; lt;/tdgt;";   }  } }  

Но если вам нужно искать по ключу, а не по идентификатору, подумайте об этом:

 $needle_keys=['21414', '21416','21418'];  foreach($dtd as $dt){   $lessons_keys = array_keys($dt['lessons']);    foreach($lessons_keys as $key){  if(in_array($key, $needle_keys)){  if($dt['lessons'][$key]){  $lession_complete= false;   echo "lt;tdgt;completed lt;/tdgt;";   } else {  echo "lt;tdgt; lt;/tdgt;";   }  }  } }  

Но в целом здесь вы можете сделать и то, и другое. Также выполните поиск по ключу и значению, просто разверните последнее if

Комментарии:

1. Это сделало свое дело. Большое вам спасибо за вашу помощь!

2. Отлично! Я рад, что это помогло. Можете ли вы одобрить это как правильный ответ?