2010-04-24 58 views
5

一直困在这一个现在,所以任何帮助将不胜感激。我有一个包含元素列表的数组(左侧),目标是使用左侧数组中的值对另一个数组(右侧)键进行排序。更改索引秩序排列

左阵列

Array 
(
    [0] => ID 
    [1] => FirstName 
    [2] => LastName 
    [3] => Address 
) 

右阵列

Array 
(
    [0] => Array 
    (
     [FirstName] => Pim 
     [Address] => Finland 
     [LastName] => Svensson 
     [ID] => 3 
    ) 
    [1] => Array 
    (
     [FirstName] => Emil 
     [Address] => Sweden 
     [LastName] => Malm 
     [ID] => 5 
    ) 
) 

我试图完成将类似于此

Array 
(
    [0] => Array 
    (
     [ID] => 3 
     [FirstName] => Pim 
     [LastName] => Svensson 
     [Address] => Finland 
    ) 

有人吗? :) 哦,我正在运行PHP 5.3,如果它有帮助!

回答

7
$output = array(); 
foreach ($right as $array) { 
    foreach ($left as $field) { 
     $temp[$field] = $array[$field]; 
    } 
    $output[] = $temp; 
} 
+0

+1简单,清晰,有效。 – goat 2010-04-24 16:01:17

+0

很棒,它做到了! – 2010-04-25 21:16:02

2

你必须爆炸阵列 商店在这样

$array = Array 
(
    [0] => Array 
    (
     [ID] => 3 
     [FirstName] => Pim 
     [LastName] => Svensson 
     [Address] => Finland 
    ); 

,然后一个变量数组爆炸阵列 爆炸数组,你会得到那么阵列的参数分隔后可以使用内爆功能将它们按任意顺序排列如你所愿

+0

你有没有得到结果 – udaya 2010-04-24 10:55:05

0

我会后退一步,看看你真正需要做什么。该数组是关联的,因此您可以立即访问正确的元素,对吗?因此,除非您使用foreach打印输出,否则您并不需要这样做。

我建议以下解决方案之一:

  1. 如果需要“正确的”数组是在关键的顺序,再看看数据库查询/相似,在选择列您需要他们的订单。
  2. Foreach要打印的人,在“左”数组中查找该订单的顺序,然后在“右”数组中打印该键的相应值。
+0

我不从数据库中选择任何东西,我从一个XML加载了simplexml的数组! – 2010-04-24 18:52:11

0

那么,你的问题是不常见的,通常关联数组用于解决有关“位置”的任何问题。 无论如何,有很多方法可以做你正在寻找什么,你在找什么。

您可以使用列表(),但它是一个基于位置:

foreach($oldArray as $o) 
{ 
    list($firstName,$lastName,$address,$id)=$oldArray; 
    $newArray[]=array($id,$firstName,$lastName,$address); 
} 

但解决你的问题很直接以正确的顺序,而不是重新排序填补后阵的最佳方式:)

+0

谢谢! 我其次,但我从另一个服务的XML获取信息,这种方式我不能总是保证数据的顺序。因此,这个奇怪的任务! :) – 2010-04-24 18:51:18

3

您可以使用uksort(),它允许您通过用户定义的函数对数组键进行排序。例如:

function sort_by_array($array) { 
    // create a sorting function based on the order of the elements in the array 
    $sorter = function($a, $b) use ($array) { 
     // if key is not found in array that specifies the order, it is always smaller 
     if(!isset($array[$a])) return -1; 
     if($array[$a] > $array[$b]) { 
      return 1; 
     } 
     return ($array[$a] == $array[$b]) ? 0 : -1; 
    }; 
    return $sorter; 
} 
// $array contains the records to sort 
// $sort_array is the array that specifies the order 
foreach($array as &$record) { 
    uksort($record, sort_by_array(array_flip($sort_array))); 
} 

我利用5中的可能性。3,动态定义功能,我用array_flip()改造:

Array 
(
    [0] => ID 
    [1] => FirstName 
    [2] => LastName 
    [3] => Address 
) 

Array 
(
    [ID] => 0 
    [FirstName] => 1 
    [LastName] => 2 
    [Address] => 3 
) 

这使得它更容易键后进行比较。

+2

1+为了灵活性,但我认为这是特别复杂的情况。 – goat 2010-04-24 16:03:21

+0

@chris:是的,在这种情况下,取决于OP真正想要对阵列做什么,它可能会变得复杂。但我想知道为什么没有人提到这种方法,我想表明这是可能的。 – 2010-04-24 16:16:17