2016-06-26 6 views
-1

Ich bevölkert ein Array aus einer While-Schleife, aber bin nicht in der Lage, das richtige Array-Format zu produzieren. Ich habe viele verschiedene Variationen getroffen, aber nicht das, wonach ich suche. Der Zweck ist, für 3rd-Party-SMTP, wie in den Variablen gesehen $toWie Array korrekt aus While-Schleife PHP

Wunsch Array:

array(3) { 
    ["[email protected]"]=> array(1) { ["userid"]=> string(1) "6" } 
    ["[email protected]"]=> array(1) { ["userid"]=> string(2) "64" } 
    ["[email protected]"]=> array(1) { ["userid"]=> string(3) "503" } 
} 

Versuch 1:

$str = array(); 
while($userEmails = $query->fetch(PDO::FETCH_ASSOC)){ 

    $str[] = '"'.$userEmails['user_email'].'" => array( 
     "userid" => "'.$userEmails['user_id'].'" 
    )'; 
} 
$to = $str; 

Versuch 1 Falsche Array:

array(3) { 
    [0]=> string(54) ""[email protected]" => array("userid" => "6")"  
    [1]=> string(54) ""[email protected]" => array("userid" => "64")" 
    [2]=> string(54) ""[email protected]" => array("userid" => "503")" 
} 

Versuch 2:

$str = ""; 
while($userEmails = $query->fetch(PDO::FETCH_ASSOC)){ 

    $str .= '"'.$userEmails['user_email'].'" => array("userid" => "'.$userEmails['user_id'].'")'; 
} 

$emails = rtrim($str, ", "); 

$to = array($emails); 

Versuch 2 Falsche Array:

array(1) { 
    [0]=> string(162) ""[email protected]" => array("userid" => "6")"[email protected]" => array("userid" => "64")"[email protected]" => array("userid" => "503")" } 
+1

imo, Es ist leichter zu verstehen, wenn Sie es als separate Schritte zunächst tun? 1) '$ userEmail = $ userEmails ['user_email'];' 2) '$ userId = $ userEmails ['user_id'];'. Es gibt so viele Möglichkeiten, dies von hier aus zu tun ... 3) (one way :) '$ str [] [$ userEmail] ['userid'] = $ userid;'. –

Antwort

1

du willst, denke ich:

$str = array(); 
while($userEmails = $query->fetch(PDO::FETCH_ASSOC)){ 
    $str[$userEmails['user_email']] = array(
     'user_id' => $userEmails['user_id'] 
    ); 
} 
0

auf diese Weise versuchen:

$str = array(); 
while($userEmails = $query->fetch(PDO::FETCH_ASSOC)){ 
    $str[$userEmails['user_email']] = array('userid' => $userEmails['user_id']); 
} 

$to = $str; 
+1

Genau das habe ich 5 Minuten vorher gepostet. – rjdown

1

Ich persönlich denke, mit while mit fetch zwingt Sie zu akzeptieren hässlichen Code. Ich habe in der Regel ein paar Hilfsfunktionen für

function query_reduce(callable $f, $initialValue, $query) { 
    $result = $initialValue; 
    while($x = $query->fetch(PDO::FETCH_ASSOC)) 
    $z = call_user_func($f, $x); 
    return $result; 
} 

Jetzt mehr deklarative Code schreiben können Sie diese

$result = query_reduce(function ($acc, $x) { 
    $acc[$x['user_email']] = [['user_id'] => $x['user_id']]; 
    return $acc; 
}, [], $query); 

var_dump($result); 

query_reduce schreiben nur einer der Helfer ist ich verwende. Hier ist eine, die wie foreach

// use like foreach 
function query_foreach(callable $f, $query) { 
    query_reduce(function($i, $x) { 
    call_user_func($f, $i++); 
    }, 0, $query); 
} 

// $query returns [{id:'a'}, {id:'b'}, {id:'c'}] 
query_foreach(function ($x, $i) { 
    echo "{$x['id']} is in position {$i}"; 
}); 

// output 
// a is in position 0 
// b is in position 1 
// c is in position 2 

Oder man arbeitet, die für die Zuordnung über die Abfrage ist

// use like array_map 
function query_map(callable $f, $query) { 
    $i = 0; 
    return query_reduce(function ($acc, $x) use ($i) { 
    return array_merge($acc, [call_user_func($f, $x, $i++)]); 
    }, [], $query); 
} 

// $query returns [{id:'a'}, {id:'b'}, {id:'c'}] 
$ids = query_foreach(function ($x, $i) { 
    return ['id'=> $x['id'], 'position'=> $i]; 
}); 

print_r($ids); 

// output... 
// Array 
// (
//  Array 
//  (
//   [id] => a 
//   [position] => 0 
// ) 
//  Array 
//  (
//   [id] => b 
//   [position] => 1 
// ) 
//  Array 
//  (
//   [id] => c 
//   [position] => 2 
// ) 
//) 
+0

Das ist großartig. Danke für die Freigabe – Klav

+0

@Klav froh, dass es Ihnen gefällt. Sobald Sie alle ausführlichen Code weg abstrahieren, sieht das Endergebnis ziemlich gut aus. – naomik

+0

Komplett. Herumspielen mit diesen war großartig – Klav