PHP双数组值对比问题:如何为数据库数组添加id字段
解决方法:给数组添加ID同时保留对比功能
你原来的$dbArray是一维数组,只存了处理后的名字字符串,直接追加ID会让数组结构混乱(既有名字又有ID),既没法正常区分数据,还会破坏原有的对比逻辑。下面给你两种可行的改造方案:
方案一:用关联数组存储ID和名字
把$dbArray改成每个元素都是包含ID和处理后名字的关联数组,这样既能保留所有数据,又能通过提取名字数组来完成对比:
<?php // database names + ids $dbArray = array(); while($rowMatch = mysqli_fetch_array($sqlTitlePerson)){ $processedName = trim(preg_replace("/\([^)]*\)/", '', $rowMatch['name'])); // 存入关联数组,同时保留id和处理后的name $dbArray[] = [ 'id' => $rowMatch['id'], 'name' => $processedName ]; } // 提取所有数据库中的名字到单独数组,用于对比 $dbNames = array_column($dbArray, 'name'); // tmdb names $tmdbArray = array(); foreach($credits['cast'] as $credit){ // 用提取出的名字数组做对比 if(!in_array($credit['name'], $dbNames)){ $tmdbArray[] = $credit['name']; } } foreach ($tmdbArray as $castArray){ echo $castArray.'<br>'; } // 如果需要使用数据库中的ID,比如遍历$dbArray: // foreach($dbArray as $item) { // echo 'ID: '.$item['id'].', Name: '.$item['name'].'<br>'; // } ?>
方案二:用名字作为键,ID作为值(更高效的对比方式)
如果你的场景只需要通过名字判断是否存在,同时需要关联对应的ID,可以用处理后的名字作为数组键,ID作为值,这样对比时用isset()更高效:
<?php // database names as keys, ids as values $dbArray = array(); while($rowMatch = mysqli_fetch_array($sqlTitlePerson)){ $processedName = trim(preg_replace("/\([^)]*\)/", '', $rowMatch['name'])); // 用处理后的名字做键,ID做值 $dbArray[$processedName] = $rowMatch['id']; } // tmdb names $tmdbArray = array(); foreach($credits['cast'] as $credit){ // 直接检查键是否存在,比in_array更高效 if(!isset($dbArray[$credit['name']])){ $tmdbArray[] = $credit['name']; } } foreach ($tmdbArray as $castArray){ echo $castArray.'<br>'; } // 如果需要获取某个名字对应的ID: // $targetName = "张三"; // if(isset($dbArray[$targetName])) { // echo '对应的ID是:'.$dbArray[$targetName]; // } ?>
为什么你之前的尝试无效?
你直接用$dbArray[] = $rowMatch['id']会让数组变成[名字1, 名字2, ID1, ID2, ...]的混合结构,in_array对比名字时会把ID也当成候选值,逻辑完全混乱,而且你也无法区分数组里的元素到底是名字还是ID,所以必须调整数组结构来同时存储两种数据。
内容的提问来源于stack exchange,提问作者Aknot
相关产品推荐
相关产品推荐

