2016-09-20 41 views
2

我得到了以下阵列:PHP取代IDS在阵列

"task" : { 
    "author_id" : 150, 
    "created_at" : somedate, 
    "status_id" : 2, 
    "assignee_id" : 100, 
    "updated_at" : somedate_too 

和我在那里我存储的ID名称通过以下方式2个关联数组:

"100" => Mike, 
"150" => Bob //etc..., the same for statuses 

我需要检查对于第一个数组中的ID,并以最有效的方式将相应数组的名称替换为数字。我尝试以下内容:

if(isset(task['status_id'])){$row = array_merge($row, [$status_ids[ 
    task['status_id']]]);}else{$row = array_merge($row, '');} 

if(isset(task['author_id'])){row = array_merge($row, [$users[// note the different array here 
    task['author_id']]]);}else{$row = array_merge($row, '');} 

if(isset(task['assignee_id'])){$row = array_merge($row, [$users[ 
    task['assignee_id']]]);}else{$row = array_merge($row, '');} 

在我的结果数组($行)中,我不能错过索引并将其替换为另一个值。如果在第一阵列中没有价值,我需要插入一个空字符串得到以下,例如:

['in progress', '', 'Mike'] 

如果第一个数组中没有AUTHOR_ID。我相信应该有一个更好的方法来做到这一点与foreach循环,但我不能找出如何因为不同的领域,我从不同的数组中获得数据。我不认为每个领域的单独if条款是最适合的。 任何帮助将受到欢迎。谢谢。

+0

你不应该将数据存储代码。大多数类型的数据库提供了一种解决这个问题的方法,通常只需要少量的代码和工作就可以实现,而不是使用php。 – symcbean

+0

实际上它是一个数据库查询的结果。我正在解析许多这样的'任务',并试图将ID与相应的名称进行映射。另外问题在于某些'任务'中的某些数据被省略 - 比如说没有assignee_id或者author_id,我需要在数组中保留空值 – Jack

+1

解决数据库中数据问题 – symcbean

回答

1

你可以在你的特殊键使用引用填充$row的时候,这样的映射到它们的阵列的同行,并使用该映射:

$users = [ 
    "100" => "Mike", 
    "150" => "Bob", 
]; 

$status_ids = [ 
    1 => "Foo", 
    2 => "Bar", 
]; 

// Define output format and array mapping 
$mapping = [ 
    "author_id" => &$users, // Mapped to $users array 
    "created_at" => null, // Not mapped, keep $task value 
    "status_id" => &$status_ids, 
    "assignee_id" => &$users, 
    "updated_at" => null, 
]; 

$task = [ 
    "author_id" => 150, 
    "created_at" => "Some date", 
    "status_id" => 2, 
    // "assignee_id" => 99999, // Oops, missing key/value => empty string in $row 
    "updated_at" => "Some other date", 
]; 

foreach ($mapping as $key => $mappedArray) { 
    @$row[] = $mappedArray 
     ? $mappedArray[$task[$key]] ?: '' 
     : $task[$key]; 
} 

print_r($row); 

输出:

Array 
(
    [0] => Bob 
    [1] => Some date 
    [2] => Bar 
    [3] => 
    [4] => Some other date 
) 
+0

谢谢。没有第三个映射数组可能做同样的事情吗? – Jack

+0

我不确定我是否遵循。你的意思是哪个阵列? – mhall

+0

第三个,你叫$ mapping。顺便说一句,结果是相同的,如果一个条目被省略(说assignee_id不是99999,但完全从数组中删除 - 键和值) – Jack

0

它应该工作(我没有尝试,但它应该给你的总体思路):

<?php 

$fields = array("author_id", "assignee_id", "status_id"); 
$aliases = array("users", "users", "status_ids"); 

foreach ($task as $key=>&$value) { 
    $alias = str_replace($fields, $aliases, ${$key}); 

    if (is_array(${$alias}) { 
     $value = array_key_exists($value, ${$alias}) ? ${$alias}[$value] : ""; 
    } 
} 
unset($value); 

然后你就可以填补你的$row,你从$task阵列计划,直接。

+0

谢谢你的想法。我会检查出来,让你知道 – Jack