php-根据特定顺序组合数组

php-根据特定顺序组合数组,php,arrays,Php,Arrays,我想组合两个数组,但我希望元素的顺序基于存储在另一个数组中的索引值 $old = array("aaa", "ccc", "ddd"); $oldPos = array(0, 2, 3); $new = array("bbb", "eee"); $combinedArr = //This is where I need help combining the $old and $new based on the logic explained below. $oldPos包含对应于$old数组中

我想组合两个数组,但我希望元素的顺序基于存储在另一个数组中的索引值

$old = array("aaa", "ccc", "ddd");
$oldPos = array(0, 2, 3);
$new = array("bbb", "eee");
$combinedArr = //This is where I need help combining the $old and $new based on the logic explained below.
$oldPos
包含对应于
$old
数组中每个元素的索引号。所以在这个例子中,“aaa”将在新数组的索引0中,“ccc”将在索引2中,“ddd”将在索引3中

$combinedArr应打印出:

"aaa", "bbb", "ccc", "ddd", "eee"

这取决于数组的排序是否正确(尽管我认为这是您尝试执行的操作的限制)


这取决于数组的排序是否正确(尽管我认为这是您尝试执行的操作的限制)

试试这个:

$old = array("aaa", "ccc", "ddd");
$oldPos = array(0, 2, 3);
$new = array("bbb", "eee");

$oldKeys = array_combine($oldPos, $old);

foreach ($new as $key => $val) {
  $curKey = $key;
  while (isset($oldKeys[$curKey])) {
   $curKey++;
  }
  $oldKeys[$curKey] = $val;
}

sort($oldKeys);
var_dump($oldKeys);
试试这个:

$old = array("aaa", "ccc", "ddd");
$oldPos = array(0, 2, 3);
$new = array("bbb", "eee");

$oldKeys = array_combine($oldPos, $old);

foreach ($new as $key => $val) {
  $curKey = $key;
  while (isset($oldKeys[$curKey])) {
   $curKey++;
  }
  $oldKeys[$curKey] = $val;
}

sort($oldKeys);
var_dump($oldKeys);

希望这一条会有帮助


希望这篇文章能有所帮助

您可以使用。对于值,只需使用将两个数组粘合在一起即可。对于键,首先,使用获取结果数组大小的整个范围,然后移除所取的键(从
$oldPos
)带有。然后再次将
$oldPos
粘合在一起,产生差异。该阵列将是您的位置。最后,您可能希望使用

这是

这种方法避免了使用显式循环(除非您是微优化人员,否则显式循环是一件好事),并确保您尽可能多地从标准PHP库中获取内容。

您可以使用。对于值,只需使用将两个数组粘合在一起即可。对于键,首先,使用获取结果数组大小的整个范围,然后移除所取的键(从
$oldPos
)带有。然后再次将
$oldPos
粘合在一起,产生差异。该阵列将是您的位置。最后,您可能希望使用

这是


这种方法可以避免使用显式循环(除非您是微优化人员,否则这是一件好事),并确保您尽可能多地从标准PHP库中获取内容。

别挂断电话,我发现了一种更直接的方法,使用
array\u multisort()
这意味着您不必将合并的关键点缝合到合并的值上。这使用了6个函数调用,而我在sevavietl的回答中评论了7个函数的方法

我更改了
old
new
数组中的值,以区分输出数组没有按字母顺序排列(OP的示例数据可能会给未来的读者造成一些混淆)

演示#1:冗长的风格

$oldvals = array("Last", "Fourth", "Second");
$oldkeys = array(4, 3, 1);
$newvals = array("First", "Third");

$vals=array_merge($oldvals,$newvals);  // forge one array with old elements first and new elements second
$newkeys=array_diff(range(0,sizeof($vals)-1),$oldkeys); // generate all necessary keys, omit "old" keys
$keys=array_merge($oldkeys,$newkeys);  // forge one array with old keys first and new keys second (as values)
array_multisort($keys,$vals);  // sort unordered keys and unordered vals in the same fashion
var_export($vals);
演示#2:浓缩风格

$oldvals=['First','Third','Fourth'];
$oldkeys=[0,2,3];
$newvals=['Second','Last'];

$vals=array_merge($oldvals,$newvals);
array_multisort(array_merge($oldkeys,array_diff(range(0,sizeof($vals)-1),$oldkeys)),$vals);
var_export($vals);
来自任一代码块的输出:

array (
  0 => 'First',
  1 => 'Second',
  2 => 'Third',
  3 => 'Fourth',
  4 => 'Last',
)

这里有一个循环
for
循环方法,它不会在无序的
$oldkeys
值上中断

$oldvals=数组(“最后”、“第四”、“第二”);
$oldkeys=数组(4,3,1);
$newvals=数组(“第一”、“第三”);

对于($i=0,$count=sizeof($oldvals)+sizeof($newvals);$i拿着手机,我发现了一种更直接的方法,使用
array_multisort()
这意味着您不必将合并键缝合到合并值上。与我在sevavietl的回答中评论的7函数方法相比,这使用了6个函数调用

我更改了
old
new
数组中的值,以区分输出数组没有按字母顺序排列(OP的示例数据可能会给未来的读者造成一些混淆)

演示#1:冗长的风格

$oldvals = array("Last", "Fourth", "Second");
$oldkeys = array(4, 3, 1);
$newvals = array("First", "Third");

$vals=array_merge($oldvals,$newvals);  // forge one array with old elements first and new elements second
$newkeys=array_diff(range(0,sizeof($vals)-1),$oldkeys); // generate all necessary keys, omit "old" keys
$keys=array_merge($oldkeys,$newkeys);  // forge one array with old keys first and new keys second (as values)
array_multisort($keys,$vals);  // sort unordered keys and unordered vals in the same fashion
var_export($vals);
演示#2:浓缩风格

$oldvals=['First','Third','Fourth'];
$oldkeys=[0,2,3];
$newvals=['Second','Last'];

$vals=array_merge($oldvals,$newvals);
array_multisort(array_merge($oldkeys,array_diff(range(0,sizeof($vals)-1),$oldkeys)),$vals);
var_export($vals);
来自任一代码块的输出:

array (
  0 => 'First',
  1 => 'Second',
  2 => 'Third',
  3 => 'Fourth',
  4 => 'Last',
)

这里有一个循环
for
循环方法,它不会在无序的
$oldkeys
值上中断

$oldvals=数组(“最后”、“第四”、“第二”);
$oldkeys=数组(4,3,1);
$newvals=数组(“第一”、“第三”);

对于($i=0,$count=sizeof($oldvals)+sizeof($newvals);$iSo,您尝试过什么吗?您可能需要知道如何组合
以及
+
(union)数组运算符@Nima我不能简单地组合这两个数组,因为位置取决于第三个数组的值。添加的新数组如何知道采取什么位置?@Matt9Atkins我认为您应该为您的问题添加更多细节。您只描述了从
$old
$oldPos
创建新数组所用的逻辑而
array\u combine
解决了这个问题。但是
$new
呢?用于组合两个数组的逻辑是什么?这里
$new[0]
已经有了一个值
“bbb”
这里应该发生什么?那么,你试过什么了吗?你可能需要知道如何
array\u combine
工作以及
+/code>(联合)数组运算符@Nima我不能简单地组合这两个数组,因为位置取决于第三个数组的值。添加的新数组如何知道采取什么位置?@Matt9Atkins我认为您应该为您的问题添加更多细节。您只描述了从
$old
$oldPos
创建新数组所用的逻辑而
array\u combine
解决了这个问题。但是
$new
呢?用于组合两个数组的逻辑是什么?这里
$new[0]
已经有一个值
“bbb”
这里应该发生什么?在看到所有的循环方法之后,我打算发布一个无循环方法。当我向下滚动将代码粘贴到文本框中时,我看到sevavietl已经击败了我!回答很好+1。我的代码片段少了一个函数调用(
count()
),但变量更多(我认为这样做比较容易)。如果有人对这个答案有点迷茫,我的演示也是一样。在看到所有的循环方法后,我打算发布一个无循环的方法。当我向下滚动将代码粘贴到文本框中时,我看到sevavietl打败了我!很好的答案+1。我的代码段少了一个函数调用(
count()
),但更多的变量(我认为这样更容易理解)。如果有人对这个answe稍感迷茫