Как добавить:: в начало первого ключа массива, когда первый ключ массива неизвестен? - PullRequest
0 голосов
/ 03 декабря 2011

Я пытаюсь динамически добавить свойства класса в подготовленный оператор PDO.Для этого мне нужно создать массив, который будет извлекать свойства из класса, помещать их в массив и добавлять: в начало каждого ключа.Затем разделите каждую клавишу запятой.Самое близкое, что я получил для этого, это использование:

foreach ($property as $field)
   $propertyValues = implode(", :", array_keys($property));
return $propertyValues;
}  

, которое дает мне
имя пользователя,: пароль

Мне просто нужен способ добавить: к первому ключукоторый в этом случае является именем пользователя.Таким образом, это выглядело бы как

: имя пользователя,: пароль

Имейте в виду, однако, что я пытаюсь сделать это динамическим, чтобы я мог расширить его функциональность на другие классы, и яЯ не всегда буду знать, что является первым ключом массива.

Если вы заинтересованы в чтении всего класса, вот оно:

<?php 
require_once("../config/main.php");

class Database{

protected static $dbFields = array('username', 'password');
public $dbConnection;
public $tableName = 'users';
public $id;
public $username;
public $password;
public function __construct() {
$this->connect();
}

public function connect(){
try {
$this->dbConnection = new PDO("mysql:host=".DB_SERVER."; dbname=".DB_NAME, DB_USER,  DB_PASS);

} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
}
public function properties() {
$properties = array();
foreach (self::$dbFields as $field) {
    if (isset($this->field) || property_exists($this, $field)) {
        $properties[$field] = $this->$field;
    }
}
return $properties;
}

public function property_values() {  

$property = $this->properties();

    $propertyValues = implode(", :", array_keys($property));

return $propertyValues;
}

public function insert(){
    // this is where all the is going to happen. it's a work in progress
// $sql  = "INSERT INTO". $this->tableName. " (";
// $sql .= implode(", ",array_keys($this->properties()));
// $sql .= ")VALUES(". ;


// $q = $this->db->prepare($sql);
// $q->execute(array('John', 'hula'));
}


}

$database = new Database();
$vals = $database->property_values();
print_r($vals);

?>

Ответы [ 2 ]

5 голосов
/ 03 декабря 2011
$propertyValues = ':'. implode(", :", array_keys($property));
2 голосов
/ 03 декабря 2011

Чтобы получить первый ключ массива, вы можете использовать надежную защиту:

reset($array);
$firstkey = key($array);

Так как вам также нужно значение (невозможно изменить ключ, можно только сбросить старый и установить новый), выможно использовать:

$value = reset($array);
$firstkey = key($array);
unset($array[$firstkey]);
$array[':'.$firstkey] = $value;

Однако

Это не самый чистый подход.Как это часто бывает, вы зациклились на настройке «вашего» подхода к работе, когда на самом деле доступен более чистый подход.

Один подход:

$keys = array_map(function($key) { return ':'.$key; }, array_keys($property));
$property = array_combine($keys, $property);

Теперь все имена свойств имеютперед ним добавлено ':'.

Другой подход заключается в том, чтобы просто вручную добавить ':';webbiedave побил меня до этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...