PHP-检查数组元素是否默认有键,或者它';他的钥匙是自动的

PHP-检查数组元素是否默认有键,或者它';他的钥匙是自动的,php,mysql,arrays,function,Php,Mysql,Arrays,Function,我知道我的问题有点奇怪,但我需要这个函数来编写。 我已经为此挣扎了一段时间 假设我有以下数组: $array = array( "column1" , "column2" , "column3"=>"value3" , "7"=>"value5" , "8"=>"value6" ); $array包含默认设置的带键元素和不带键元素。 我知道没有键的元素将设置数字自动键 我正在尝试编写一个函数,将此数组转换为以下MYSQL se

我知道我的问题有点奇怪,但我需要这个函数来编写。 我已经为此挣扎了一段时间

假设我有以下数组:

$array = array(
    "column1" , 
    "column2" , 
    "column3"=>"value3" , 
    "7"=>"value5" , 
    "8"=>"value6" 
);
$array包含默认设置的带键元素和不带键元素。 我知道没有键的元素将设置数字自动键

我正在尝试编写一个函数,将此数组转换为以下MYSQL select语句:

SELECT `column1` , `column2` , `column3` , `1` , `0` FROM table WHERE column3 = 'value3' AND 1 = 'value5' AND 0 = 'value6';
Mysql表名可以是数字。

在我的函数中,我必须检查数组元素是否有一个由php设置的键或由用户发送的键

到目前为止,我的职能形式如下:

//Function that converts WHERE simple statement to Array
function arrayToQuery($array){
    if(is_array($array)){
        $selectedColumns = array();
        $whereColumns = array();
        foreach($array as $key=>$value){
            //This is where I'm stuck, I can't write the is_automated() function
            if(!is_automated($key)){
                $whereColumns[$key] = $value;
            }
            $selectedColumns[] = $key;
        }
        $sql = "SELECT " . join(",", $selectedColumns) . " WHERE ";
        foreach($whereColumns as $column=>$value){
            $sql .= $column . " = " . $value . " AND ";
        }
        $sql .= " 1=1 ";
        return $sql;
    }
    return false;
}
我被is_automated()函数卡住了,我无法检查任何一个键是否是自动的


谢谢,PHP会自动将“0”转换为整数,因此,恕我直言,无法检查是否自动分配了密钥

为什么不使用
null
false

$array = array(
    "column1" => null,
    "column2" => null,
    "column3"=>"value3" , 
    "1"=>"value5" , 
    "0"=>"value6" 
);
null
的唯一问题是如何确定用户希望在查询中
何时为null
。在这种情况下,您可以使用
false
并严格检查
if($value==false)

在我看来,您还应该考虑在查询生成中使用预先准备好的语句,以避免注入的可能性

更新:

如果开发人员要使用这个,他们可能不应该使用数组。您应该有一个类和一个方法来加载它。例如:

public function addField($name, $value=false) {
   $this->fields[$name] = $value;
}

PHP会自动将“0”转换为整数,所以很抱歉,无法检查是否自动分配了密钥

为什么不使用
null
false

$array = array(
    "column1" => null,
    "column2" => null,
    "column3"=>"value3" , 
    "1"=>"value5" , 
    "0"=>"value6" 
);
null
的唯一问题是如何确定用户希望在查询中
何时为null
。在这种情况下,您可以使用
false
并严格检查
if($value==false)

在我看来,您还应该考虑在查询生成中使用预先准备好的语句,以避免注入的可能性

更新:

如果开发人员要使用这个,他们可能不应该使用数组。您应该有一个类和一个方法来加载它。例如:

public function addField($name, $value=false) {
   $this->fields[$name] = $value;
}

您的示例数组正在覆盖前2个元素。我运行了以下命令:

$array = array(
        "column1" ,
        "column2" ,
        "column3"=>"value3" ,
        "1"=>"value5" ,
        "0"=>"value6"
);
print_r($array);
得到了这个输出:

Array
(
    [0] => value6
    [1] => value5
    [column3] => value3
)

您的示例数组正在覆盖前2个元素。我运行了以下命令:

$array = array(
        "column1" ,
        "column2" ,
        "column3"=>"value3" ,
        "1"=>"value5" ,
        "0"=>"value6"
);
print_r($array);
得到了这个输出:

Array
(
    [0] => value6
    [1] => value5
    [column3] => value3
)

您需要知道,在PHP中,没有“无键”数组。我们可以在代码中编写数组,不需要键,只需要值,但解释器在读取/解析时会自动分配数字索引

这个

数组('1','2','3')

。。。与此完全相同:

array(0=>one',1=>two',2=>three')


结论:数组键在PHP中始终存在,无论您是否编写了它。如果您没有在代码中放入键*(这是100%合法的),那么键仍然存在(必须存在),并且将被视为数字键。

您需要知道,在PHP中,没有“无键”数组。我们可以在代码中编写数组,不需要键,只需要值,但解释器在读取/解析时会自动分配数字索引

这个

数组('1','2','3')

。。。与此完全相同:

array(0=>one',1=>two',2=>three')


结论:数组键在PHP中始终存在,无论您是否编写了它。如果您不在代码*(100%合法)中放入键,则键仍然存在(必须存在),并且将被视为数字键。

如果您选择保留此结构,您可能需要创建一个类来处理此问题。在PHP5中,类可以扩展,从而产生独特的用例,如您正在描述的用例

例如:

<?php
class MySQLArray extends ArrayIterator {
    public $container,$noKeySet,$current, $flags;

    public function __construct() {
        $this->setFlags(1);
    }
    
    public function offsetSet($offset,$value) {
        if(!isset($offset)) {
            $this->noKeySet[] = $value;
        }
        return parent::offsetSet($offset,$value);
    }
    
    public function isAutomated($key) {
        if(isset($this->noKeySet[$key])) {
            return true;
        }
        return false;
    }
}

$array = new MySQLArray();
$array[] = "column1"; 
$array[] = "column2";
$array["column3"] = "value3"; 
$array[7] = "value5" ;
$array[8] ="value6";

function arrayToQuery($array){
        $selectedColumns = array();
        $whereColumns = array();
        foreach($array as $key=>$value){ gettype($value);
            //This is where I'm stuck, I can't write the is_automated() function
            if(!$array->isAutomated($key)){
                $whereColumns[$key] = $value;
            }
            $selectedColumns[] = $key;
        }
        $sql = "SELECT " . join(",", $selectedColumns) . " WHERE ";
        foreach($whereColumns as $column=>$value){
            $sql .= $column . " = " . $value . " AND ";
        }
        $sql .= " 1=1 ";
        return $sql;
    return false;
}

?>

不幸的是,您将无法使用许多快速数组实现程序或任何速记,因为您正在和一个对象交互

然而 更好的最终解决方案是依赖于数组以外的其他东西。根据您的用例(未指定),可以有多种方法来实现这一点,而不是使用单一数组

首先,为什么要将数字作为SQL列?这不是很好的解释,对我来说似乎不可扩展。如果您有理由将数字作为列,根据您的开发阶段,一个相对简单的修复方法是在每个数字前面放置一个限定符(例如,stage_1、stage_2等),然后将限定符放入数组中


就目前而言,如果您尝试将数字键和值放在一起,那么您的数组将做一些古怪的事情。因此,我不会重复其他人发布的内容,我将建议您查看关于为什么这是不可持续的伟大解释。

如果您选择保留此结构,您可能会希望创建一个类来处理此问题。在PHP5中,类可以扩展,从而产生独特的用例,如您正在描述的用例

例如:

<?php
class MySQLArray extends ArrayIterator {
    public $container,$noKeySet,$current, $flags;

    public function __construct() {
        $this->setFlags(1);
    }
    
    public function offsetSet($offset,$value) {
        if(!isset($offset)) {
            $this->noKeySet[] = $value;
        }
        return parent::offsetSet($offset,$value);
    }
    
    public function isAutomated($key) {
        if(isset($this->noKeySet[$key])) {
            return true;
        }
        return false;
    }
}

$array = new MySQLArray();
$array[] = "column1"; 
$array[] = "column2";
$array["column3"] = "value3"; 
$array[7] = "value5" ;
$array[8] ="value6";

function arrayToQuery($array){
        $selectedColumns = array();
        $whereColumns = array();
        foreach($array as $key=>$value){ gettype($value);
            //This is where I'm stuck, I can't write the is_automated() function
            if(!$array->isAutomated($key)){
                $whereColumns[$key] = $value;
            }
            $selectedColumns[] = $key;
        }
        $sql = "SELECT " . join(",", $selectedColumns) . " WHERE ";
        foreach($whereColumns as $column=>$value){
            $sql .= $column . " = " . $value . " AND ";
        }
        $sql .= " 1=1 ";
        return $sql;
    return false;
}

?>

不幸的是,您将无法使用许多快速数组实现程序或任何速记,因为您正在和一个对象交互

然而 更好的最终解决方案是依赖于数组以外的其他东西。根据您的用例(未指定),可以有多种方法来实现这一点,而不是使用单一数组

首先,为什么要将数字作为SQL列?这不是很好的解释,对我来说似乎不可扩展。如果您有理由将数字作为列,根据您的开发阶段,一个相对简单的修复方法是在每个数字前面放置一个限定符(例如,stage_1、stage_2等),然后将限定符放入数组中

就目前而言,如果您尝试使用数字ke,您的数组将做一些古怪的事情