Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果在数组中,则替换为相应的列_Php - Fatal编程技术网

Php 如果在数组中,则替换为相应的列

Php 如果在数组中,则替换为相应的列,php,Php,更新: 我实际上在做什么: 我正在制作一个ETL工具,并用php编写其脚本: ETL是为特定领域而设计的,提供的数据与其结构一致,但数据中存在一些污点,需要删除,如H.NO,H#,H.NO。应为=HNO: 我正在使用存储过程的方法。在其中,我为错误的值创建了一个查找表,并用正确的值替换它们,以便最终存储的数据应该是完美的 我必须检测db表中的错误值,并用正确的值替换它们,仅此而已 我已经创建了一个数组$find[],它存储来自DB的值,然后有一个变量$exist,我想检查它是否存在于$find

更新: 我实际上在做什么:

我正在制作一个ETL工具,并用php编写其脚本: ETL是为特定领域而设计的,提供的数据与其结构一致,但数据中存在一些污点,需要删除,如
H.NO,H#,H.NO。应为=HNO
: 我正在使用存储过程的方法。在其中,我为错误的值创建了一个查找表,并用正确的值替换它们,以便最终存储的数据应该是完美的

我必须检测db表中的错误值,并用正确的值替换它们,仅此而已


我已经创建了一个数组
$find[]
,它存储来自DB的值,然后有一个变量
$exist
,我想检查它是否存在于
$find[error]
数组(列)中。如果它这样做,那么它的值将被替换为相应的cloumn值
$find[right]
。请让我知道我如何能做这样的替换。谢谢

注意:My DB表只包含两列,分别命名为
Error和right

当我转储
$find
数组时,它给了我以下输出:
Array([0]=>Array([0]=>FSc[错误]=>FSc[1]=>FSc[正确]=>FSc)[1]=>Array([0]=>FSc[错误]=>FSc[1]=>FSc[正确]=>FSc)

代码:


在MySQL中自行求解。检索时:

 SELECT right, IF(wrong='$exist',right,wrong) as wrong from lookup
当然,使用PDO&prepared语句而不是mysql_173,或者在转义变量时要非常小心

但是,如果需要删除“错误”数据:

 UPDATE data_to_fix
 LEFT JOIN lookup l1
 ON data_to_fix.some_field1 LIKE l1.wrong
 LEFT JOIN lookup l2
 ON data_to_fix.some_field2 LIKE l2.wrong
 SET 
   data_to_fix.some_field1 = IFNULL(l1.right, data_to_fix.some_field1),
   data_to_fix.some_field2 = IFNULL(l2.right, data_to_fix.some_field2);

好的,您只需将查询更改为

"SELECT right FROM lookup WHERE wrong = '" . $exists . "'"
如果不存在匹配项,则返回0行。如果存在匹配项,则返回一行(或多行,具体取决于表的设置方式)

您应该在
错误
字段上有一个索引来优化查询。如果
错误
的任何值都应该只有一个特定的
正确
(即
错误
在每一行上都是唯一的),则将
错误
作为唯一索引来强制执行其唯一性


更新的答案与修改后的问题相匹配。我只需使用SQL查询更新映射表中的错误数据

因此,我假设您的DB结构可以如下所示:

the_table
---------
the_field (the field you are trying to change)
... some other fields

mapping_table
---------
wrong
right
然后,您需要运行的查询使用经过消毒的值更新表,如下所示

UPDATE the_table AS t
INNER JOIN mapping_table AS mt ON t.the_field = mt.wrong
SET bt.the_field = mt.right

这会将表就地更新为新值。显然,如果不想就地更改表,可以创建表的副本,然后对该表副本运行此查询。

试试这个。您还需要使用PDO或mysqli,因为mysql_*很快就会消失

<?php
function check_wrong_right($exist) {
    $lookup = mysql_query("select right from lookup WHERE wrong = '" . mysql_real_escape_string($exist). "'");
    if (mysql_num_rows($lookup) == 1) {
        $row = mysql_fetch_array($lookup);
        return $row['right'];
    }
    return $exist;
}

echo check_wrong_right('FSc');

你到底想做什么?解决这个问题肯定有
对的
错的
方法,我担心你选择了
错的
方法。你只是想得到数据库中存在的
对的
的值,该值在
错的
中等于
$exists
?@MikeBrant是的,你是对的,事实上我正在执行数据清理,所以我创建了一个查找表。我还想替换其他各种字段,所以我想如果我将它们存储到数组中,然后进行检查,这样我就可以更快地得到结果,因为我正在处理来自数据库的约50K行,需要清理脏数据a请让我知道在您看来,我这样做是正确的还是应该使用其他一些技巧,目前我正在做的是上传一个文件并将其转储到我的数据库,然后从数据库中获取值并对其执行清理…如果这是一次性数据迁移,那么这肯定是错误的方法。您可能会被拒绝即使涉及到PHP,你也可以做任何你需要做的事情。如果你能澄清你在问题中想做什么,那么我肯定会提供帮助。@softgenic看一看修改后的答案。请看一看,你可以测试,我测试了查询,但
H。不
不会重演,所以这项技术将在O(1)中运行?因为我处理的是~50K行,我必须一次又一次地查找..如果您需要永久更新它们…只需在cron下运行更新查询(我将在中添加答案),应该足够快。如果“错误”数据不断出现,MYSQL本身中的BEFORE INSERT/BEFORE UPDATE触发器可能是正确的,完全不需要“定期”修复。+1,您的更新非常好,实际上在
H.No.address…
等字段中有一些字符串,因此我必须从这些字符串中替换
H.No.部分对于HNO ONLY
,在这种情况下,查询应该是什么,我也不是在处理一个字段,而是在处理表中的7个字段,因此如果您相应地更新查询(至少3个字段),我将不胜感激。谢谢你能给我们一个类似的,因此,在你的
错误的
列中会有
'H.No.%
,而
ON
子句将是
关于数据的
来修复一些类似查找的字段。错误的
。对于每个字段,你都需要在查找表上进行单独的连接,所以使用别名。或者你当然可以运行7个单独的查询。我已经修改了这个例子有两列而不是三列,因为我不喜欢别人告诉我在帮助别人的时候该做什么,但是我会找到足够多的同情来提供答案,而不是停在那里。
<?php
function check_wrong_right($exist) {
    $lookup = mysql_query("select right from lookup WHERE wrong = '" . mysql_real_escape_string($exist). "'");
    if (mysql_num_rows($lookup) == 1) {
        $row = mysql_fetch_array($lookup);
        return $row['right'];
    }
    return $exist;
}

echo check_wrong_right('FSc');