首页 > 解决方案 > 如何通过在具有“A”id 的“B”数组中搜索来返回“C”值

问题描述

我不明白如何在具有值的数组中搜索并从搜索的行返回另一个值。

所以,我为此使用了 foreach/for 循环,但它只为第一个函数请求返回我。使用 1 次后,函数返回空值。

下面是 for 循环的代码:

$users = $bdd->query('SELECT * FROM userkeys');
$scripts = $bdd->query('SELECT * FROM scripts');

function GetNameFromId($users, $id){ // $users = PDO Statement - $id = value to search in array
  $users = $users->fetchAll(); 
  for($i = 0, $size = count($users); $i < $size; ++$i) {
    if($users[$i]['id'] == $id){
      return $users[$i]['name'];
      
    }
  }
}

这是 foreach 循环的代码:

$users = $bdd->query('SELECT * FROM userkeys');
$scripts = $bdd->query('SELECT * FROM scripts');

function GetNameFromId($users, $id) { // $users = PDO Statement - $id = value to search in array
    foreach($users as $user) {
        if($user['id'] == $id) {
            return $user['name'];
        }
    }
}

代码在哪里执行? 问题是我在哪里调用函数: echo GetNameFromId($users, [...]) 。'<br>';

<tbody>
                    <?php foreach($scripts as $script): ?>
                    <tr>
                      <th scope="row">
                        <?= $script['id']; ?>
                      </th>
                      <th scope="row">
                        <?= $script['name']; ?>
                      </th>
                      <th scope="row">
                        <?= $script['price']; ?>
                      </th>
                      <td>
                        <span class="badge badge-dot mr-4">
                          
                          <?php if($script['state'] == 1){?>
                            <i class="bg-danger"></i>
                            <span class="status">démarrage</span>
                          <?php }elseif($script['state'] == 2){ ?>
                            <i class="bg-info"></i>
                            <span class="status">en cours</span>
                          <?php }elseif($script['state'] == 3){ ?>
                            <i class="bg-warning"></i>
                            <span class="status">en retard</span>
                          <?php }elseif($script['state'] == 4){ ?>
                            <i class="bg-success"></i>
                            <span class="status">livré</span>
                          <?php } ?>
                        </span>
                      </td>
                      <td>
                        <div class="d-flex align-items-center">
                          <span class="completion mr-2"><?= $script['percent']; ?>%</span>
                          <div>
                            <div class="progress">
                              <?php if($script['percent'] <= 33){?>
                                <div class="progress-bar bg-danger" role="progressbar" aria-valuenow="<?= $script['percent']; ?>" aria-valuemin="0" aria-valuemax="100" style="width: <?= $script['percent']; ?>%;"></div>
                              <?php }elseif($script['percent'] > 33 AND !($script['percent'] == 100)){ ?>
                                <div class="progress-bar bg-info" role="progressbar" aria-valuenow="<?= $script['percent']; ?>" aria-valuemin="0" aria-valuemax="100" style="width: <?= $script['percent']; ?>%;"></div>
                              <?php }else{ ?>
                                <div class="progress-bar bg-success" role="progressbar" aria-valuenow="<?= $script['percent']; ?>" aria-valuemin="0" aria-valuemax="100" style="width: <?= $script['percent']; ?>%;"></div>
                              <?php } ?>
                            </div>
                          </div>
                        </div>
                      </td>
                      <th scope="row">
                        <?php 
                            $decode = json_decode($script['client_id']);
                            echo var_dump($decode);
                            if(is_array($decode)){
                              for($i = 0, $size = count($decode); $i < $size; ++$i) {
                                echo GetNameFromId($users, intval($decode[$i])) . '<br>'; 
                              }
                              
                            }else{
                              echo GetNameFromId($users, $script['client_id']) . '<br>';
                            }
                          ?>
                      </th>
                      <td>
                        <div class="dropdown">
                          <a class="btn btn-sm btn-icon-only text-light" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                            <i class="fas fa-pen text-info"></i>
                          </a>
                          <div class="dropdown-menu dropdown-menu-right dropdown-menu-arrow">
                            <a class="dropdown-item" href="updates.php?type=1&id=<?= $script['idhash']; ?>">Ajouter une update</a>
                            <a class="dropdown-item" href="updates.php?type=2&id=<?= $script['idhash']; ?>">Modifier le script</a>
                            <a class="dropdown-item" href="updates.php?type=3&id=<?= $script['idhash']; ?>">Supprimer le script</a>
                          </div>
                        </div>
                      </td>
                    </tr>
                        <?php endforeach; ?>
                  </tbody>

要恢复,当我使用该功能 1 次时,它工作得很好,但如果我使用它超过 1 次,第一个值是好的,但所有其他的都是空的。

谢谢 !

标签: phparraysfor-loopforeach

解决方案


当您执行此操作时,我正确阅读了此内容

$users = $bdd->query('SELECT * FROM userkeys'); 

您实际上是在返回一个语句对象,而不是一个数组。您不能一遍又一遍地重用语句对象,您应该从对象中获取所有行并将其放在 $users 数组中。从那时起,您可以将 $users 变量作为数组重用。

这是我的例子

$usersstmt = $bdd->query('SELECT * FROM userkeys');
$users = $usersstmt->fetchAll();
$scriptsstmt = $bdd->query('SELECT * FROM scripts');
$scripts= $scriptsstmt->fetchAll();



function GetNameFromId($users, $id){
   foreach($users as $user) {
      if($user['id'] == $id){
         return $user['name'];
      }
    }  
}  

推荐阅读