Intereting Posts

PDO fetchAll () первичный ключ как ключ группы массива

Таким образом, я работаю с PDO уже пару месяцев, однако я пришел в затруднительное положение. Я хочу сохранить содержимое указанной базы данных в массив, сгруппированный по их основным ключам. (Вместо бесполезного способа PDO fetchAll () организует их).

Мой текущий код:

$DownloadsPDO = $database->dbh->prepare("SELECT * FROM `downloads`"); $DownloadsArray = $DownloadsPDO->execute(); $DownloadsArray = $DownloadsPDO->fetchAll(); 

Что затем выводит:

 Array ( [0] => Array ( [id] => 0 [0] => 0 [path] => /xx-xx/testfile.zip [1] => /xx-xx/testfile.zip [name] => Test Script [2] => Test Script [status] => 1 [3] => 1 ) [1] => Array ( [id] => 1 [0] => 1 [path] => /xx-xx/test--file.zip [1] => /xxxx/testfile.zip [name] => New Script-UPDATE [2] => New Script-UPDATE [status] => 1 [3] => 1 ) ) 

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

Итак, мой вопрос: возможно ли мне группировать каждый массив по их первичному ключу (который является id)

благодаря

Вы можете просто использовать

 $results = array_map('reset', $stmt->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_ASSOC)) 

Это должно дать то, что вы ищете:

 $results = $pdos->fetchAll(\PDO::FETCH_UNIQUE|\PDO::FETCH_ASSOC); 

Я все еще предлагаю вам цикл с использованием метода fetch() . В противном случае вы можете использовать array_reduce() для итерации по массиву. Здесь приведен пример кода .

Код (в удобочитаемой форме) будет:

 $myFinalArray = array_reduce($myInputArray, function($returnArray, $temp) { $temp2 = $temp['id']; unset($temp['id']); $returnArray[$temp2] = $temp; return $returnArray; } ); с $myFinalArray = array_reduce($myInputArray, function($returnArray, $temp) { $temp2 = $temp['id']; unset($temp['id']); $returnArray[$temp2] = $temp; return $returnArray; } ); 

Я решил просто пропустить результаты с помощью fetch () и ввести их в массив по мере продвижения, это код, который я использовал, и он работает просто отлично:

 $DownloadsPDO = $database->dbh->query("SELECT * FROM `downloads`"); $Array = array(); while ($d = $DownloadsPDO->fetch()) { $Array[$d['id']]["id"] = $d['id']; $Array[$d['id']]["name"] = $d['name']; $Array[$d['id']]["path"] = $d['path']; } // Outputs Array ( [1] => Array ( [id] => 1 [name] => Test Script [path] => /xxxx/testfile.zip ) [2] => Array ( [id] => 2 [name] => New Script-UPDATE [path] => /xxxx/testfile.zip ) ) 

Которая использует первичный ключ (являющийся id) в качестве имени для ключа массива, а затем добавляет в него данные.

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

Я хотел бы указать на единственное решение, которое работает для меня:

fetchAll(\PDO::FETCH_GROUP|\PDO::FETCH_UNIQUE|\PDO::FETCH_ASSOC);

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

SELECT id_keyname AS arrkey, id_keyname, .... FROM ...

Итак, мой вопрос: возможно ли мне группировать каждый массив по их первичному ключу (который является id)

Конечно, у вас есть 2 варианта: либо изменить запрос, либо проанализировать набор результатов. Итак, я уверен, что вы не хотите изменять сам запрос, поэтому я бы пошел с парсингами.

Примечание. Вы должны использовать подготовленные операторы SQL, когда они имеют смысл. Если вы хотите связать некоторые параметры, тогда его OKAY. Но в этом случае вам нужно только получить get result-set, поэтому prepare() и fetch() будут переполнены.

Так что у тебя есть:

 Array ( [0] => Array ( [id] => 0 [0] => 0 [path] => /xx-xx/testfile.zip [1] => /xx-xx/testfile.zip [name] => Test Script [2] => Test Script [status] => 1 [3] => 1 ) [1] => Array ( [id] => 1 [0] => 1 [path] => /xx-xx/test--file.zip [1] => /xxxx/testfile.zip [name] => New Script-UPDATE [2] => New Script-UPDATE [status] => 1 [3] => 1 ) ) 

И вы хотите:

 Array( [id] => Array('bar' => 'foo') ....) 

Ну, вы можете сделать что-то вроде этого:

 $stmt = $database->dbh->query("SELECT * FROM `downloads`"); $result = array(); foreach($stmt as $array){ $result[$array['id']] = $array; } print_r($result); // Outputs: Array(Array('id' => Array(...)))