2013-07-30 26 views
0

在我的PHP应用程序中。我从用户获取价值,所有这些用户值都存储在Array中。只是为了验证。我正在比较用户输入值与我的数组。 : -检查主阵列中是否存在从阵列中的值快速通过PHP无循环

<?php 

// Current Code 

$masterArray = array(......); // ..... represents some 60-100 different values. 

foreach($_POST as $key => $value) { 
    if(in_array($value, $masterArray)) { 
     $insertQuery = $mysqli->query("INSERTION stuff or Updating Stuff"); 
    } else { 
     echo "Are you tampering html-form-data ?"; 
    } 
} 

?> 

但这这么不值钱代码,因为它需要相当的好时机在更新或插入。

是否有任何更好的功能那是方式更快检查如果从数组中的值存在于主数组中?

从阵列我的意思是用户输入值的=>列表/阵列。

主数组我的意思是=>列表我的数组值存储在页

感谢

+0

检查不是问题它的一个插入查询每个数组项目,你con连接,所以你只能在最后做一个查询。 – 2013-07-30 23:37:56

+0

目前还不清楚你在问什么。你是否试图避免使用'in_array',因为它在数据库下进行了数组遍历? ([更多这里](http://stackoverflow.com/questions/2350361/how-is-the-php-array-implemented-on-the-c-level))在这种情况下,J.大卫史密斯的答案是好的。或者你是否试图避免通过'$ _POST'循环?为此,我会说:为什么不只是验证你关心的领域,而不是看看'$ _POST'中的所有内容? – grossvogel

+0

你没有提到你的主数组是否是“key”=>“value”格式 – Ibu

回答

1

我想我用array_diff得到了更好的选择。

请让我知道如果我在下面做错什么之前,我在制作网页把这个代码: - 非常感谢你的努力@ J.David史密斯& @grossvogel

<?php 
    $masterArray = array(.......); // My Master Array List 

    $result = array_diff($_POST['checkBox'], $masterArray); 

    if(count($result) > 0) { 
     // If they are trying to do some tampering , let them submit all again. 
     echo 'Something is not Right'; 
    } else { 
     // If Person is genuine, no waiting just insert them all  
     $total = count($_POST['checkBox']); 
     $insertQuery = "INSERT into notes(user,quote) values "; 
     for($i=0;$i<=$total; $i++) { 
      array_push($values, "('someuser','".$mysqli->real_escape_string($_POST['checkBox'][$i])."')"); 
     } 
     $finalQuery = $mysqli->query($insertQuery.implode(',', $values)); 

    } 

?> 

是我的代码更好的是,我在本地主机上测试它,我没有看到太大的区别,我只是想知道专家意见如果我正在搞东西?在将此代码放入生产页面之前。

更新:这看起来比代码有问题更好,更快。

谢谢

+0

我不知道这个功能,很荣幸能找到它,并且: [使用准备声明!](http://php.net/manual/en/pdo.prepared-statements.php) –

+0

w00t ...这就像一个魅力,相对更快。感谢@ J.DavidSmith&@ grossvogel的努力。 :) –

0

唯一的其他方式做到这一点是使用关联数组与你的价值观作为键(当然,你可以专门定制实现另一个存储容器的方法,但是那会是矫枉过正IMO)。然后,您可以使用isset进行确认。例如:

$masterArray = array(....); // same thing, but with values as keys instead of values 

foreach($_POST as $key => $value) { 
    if(isset($masterArray[$value])) { 
     // do stuff 
    } else { 
     // do stuff 
    } 
} 

我有点好奇,这样做的一点是什么呢,尤其是考虑到您的通话echo打印的声明。可能有更好的方法来完成你的目标。

编辑:建议的另一种方法grossvogel:在$masterArray而不是$_POST上循环。如果你期望$_POST是一个大的数据集(即大多数时候人们会选择50+项),那么这个可以更快地成为Hashing已经很快了,所以你必须在代码上进行基准测试才能做出决定。

$masterArray = array(...); // either style of definition will work; i'll use yours for simplicity 

foreach($masterArray as $value) { 
    if(isset($_POST[$value])) { 
     // do stuff 
    } 
} 
+0

没有循环没有选项。在未来,几乎没有可能性,我的阵列可能有170-200个值。 –

+0

我很想知道你的意见。你在想什么 ?请告诉我。谢谢 –

+0

我认为这是某种形式的输入验证。你究竟在做什么验证? 如果你想检查'$ _POST'中的每个值,你需要'foreach'或者一个循环的函数(尽管如此,还是一个循环)。这是没有办法的。 –