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稍感迷茫