2011-10-16 23 views
0

我有以下内容的关联数组:在assoc中分组项目。阵列

Array 
(
    [L_TIMESTAMP0] => 2011%2d10%2d16T16%3a57%3a38Z 
    [L_TIMESTAMP1] => 2011%2d10%2d16T16%3a45%3a23Z 
    [L_TIMESTAMP2] => 2011%2d10%2d16T16%3a35%3a54Z 
    [L_TIMEZONE0] => GMT 
    [L_TIMEZONE1] => GMT 
    [L_TIMEZONE2] => GMT 
    [L_STATUS0] => Completed 
    [L_STATUS1] => Completed 
    [L_STATUS2] => Completed 
    [TIMESTAMP] => 2011%2d10%2d16T17%3a58%3a39Z 
) 

我想要做的就是“群”到自己的阵列L_TIMESTAMP0,L_TIMEZONE0和L_STATUS0(和L_TIMESTAMP1,L_TIMEZONE1,L_STATUS1)的所有实例,或者作为多维数组的一部分。但我似乎无法弄清楚我将如何去完成这件事。

预期的结果将是:

Array 
    (
     [L_TIMESTAMP0] => 2011%2d10%2d16T16%3a57%3a38Z 
     [L_TIMEZONE0] => GMT 
     [L_STATUS0] => Completed 
    ) 

Array 
    (
     [L_TIMESTAMP1] => 2011%2d10%2d16T16%3a45%3a23Z 
     [L_TIMEZONE1] => GMT 
     [L_STATUS1] => Completed 
    ) 

我想这会是一个简单的for循环简单,但是这并没有给我,我要找的结果。

任何想法?
很可能东西很明显,但我已经对这个花的最后几天,我不能弄明白(尽管这可能说更多关于我的技术不是问题)

编辑:
添加;我不需要我的特定问题的确切代码,但任何指向我应该看看什么方向的指针将不胜感激。

+1

请上传你试过的代码。 –

+0

你能给出预期的结果吗? – xdazz

+0

嗨费利克斯,我没有任何相关的代码,因为我不知道我应该尝试什么。 – Robert

回答

3
<?php 
$groupRegex = '/([0-9]+)$/'; 
$multiArray = array(); 
$assocArray = array (
    "L_TIMESTAMP0" => "2011%2d10%2d16T16%3a57%3a38Z", 
    "L_TIMESTAMP1" => "2011%2d10%2d16T16%3a45%3a23Z", 
    "L_TIMESTAMP2" => "2011%2d10%2d16T16%3a35%3a54Z", 
    "L_TIMEZONE0" => "GMT", 
    "L_TIMEZONE1" => "GMT", 
    "L_TIMEZONE2" => "GMT", 
    "L_STATUS0" => "Completed", 
    "L_STATUS1" => "Completed", 
    "L_STATUS2" => "Completed", 
    "TIMESTAMP" => "2011%2d10%2d16T17%3a58%3a39Z" 
); 

foreach($assocArray as $key => $value) { 
preg_match($groupRegex, $key, $group); 

    if(!isset($group[1])){ 
    continue; 
    } 

$group = intval($group[1]); 
    if(is_array($multiArray[$group])) { 
    $multiArray[$group][$key] = $value; 
    } 
    else { 
    $multiArray[$group] = array($key => $value); 
    } 
} 
echo "<pre>"; 
print_r($multiArray); 
echo "</pre>"; 
?> 

结果

Array 
(
    [0] => Array 
    (
     [L_TIMESTAMP0] => 2011%2d10%2d16T16%3a57%3a38Z 
     [L_TIMEZONE0] => GMT 
     [L_STATUS0] => Completed 
    ) 

    [1] => Array 
    (
     [L_TIMESTAMP1] => 2011%2d10%2d16T16%3a45%3a23Z 
     [L_TIMEZONE1] => GMT 
     [L_STATUS1] => Completed 
    ) 

    [2] => Array 
    (
     [L_TIMESTAMP2] => 2011%2d10%2d16T16%3a35%3a54Z 
     [L_TIMEZONE2] => GMT 
     [L_STATUS2] => Completed 
    ) 

) 
+0

你,先生,真棒。谢谢!我怀疑我不得不开始preg_match'ing,但不知道我会如何处理它。这有助于一堆。 – Robert

+0

请注意,虽然它与您的预期结果相符,但如果生成的多维数组没有保留字符串键中的编号会更好,因为编号会是多余的 – Esailija

0
$restructuring = true; 
$count = 0; 
$new_array = array(); 
while($restructuring) 
{ 
    $restructuring = false; 
    foreach($original_array as $oa) 
    { 
    if(!array_key_exists($count, $new_array) && array_key_exists('L_TIMESTAMP'.$count, $original_array)) 
    { 
     $new_element = array(); 
     foreach(array('TIMESTAMP', 'TIMEZONE', 'STATUS') as $e) 
     if(!empty($original_array['L_'.$e.$count])) $new_element[$e.$count] = $original_array['L_'.$e.$count]; 
     $new_array[] = $new_element; 
     $count++; 
     $restructuring = true; 
    } 
    } 
} 

鉴于在这个问题定义$ original_array,在$ new_array将是:

Array 
(
    [0] => Array 
     (
      [TIMESTAMP0] => 2011%2d10%2d16T16%3a57%3a38Z 
      [TIMEZONE0] => GMT 
      [STATUS0] => Completed 
     ) 

    [1] => Array 
     (
      [TIMESTAMP1] => 2011%2d10%2d16T16%3a45%3a23Z 
      [TIMEZONE1] => GMT 
      [STATUS1] => Completed 
     ) 

    [2] => Array 
     (
      [TIMESTAMP2] => 2011%2d10%2d16T16%3a35%3a54Z 
      [TIMEZONE2] => GMT 
      [STATUS2] => Completed 
     ) 

) 
+0

我最初忽略子元素的键中的数字,因为它们是多余的,但是我看到了对数字放在键中的问题所做的调整,所以我将它们添加进去了。 – ghbarratt