[英]PHP order array acording to another array values
我有两个数组,一个数组包含字符串元素,另一个数组恰好具有这些元素应该位于的位置。 在第二个数组中,键表示位置,而值表示第一个数组中的值应该位于的位置。 但是我无法使它工作。 这是我到目前为止的代码:
<?php
$array1= array("d","c","b","e","a");
$poss = array (3 ,2 ,1 ,4 ,0);
var_dump(orderArray($poss, $array1));
function orderArray($poss, $data){
$countPoss = count($poss);
$countData = count($data);
if ($countPoss === $countData){
for ($i=0; $i<$countData; $i++){
if($poss[$i]!==$i){
$aux = $data[$i];
$data = insertArrayIndex($data, $aux, $poss[$i]);
unset($data[$i]);
$data = array_values($data);
}
}
}else{
return FALSE;
}
return $data;
}
function insertArrayIndex($array, $new_element, $index) {
$start = array_slice($array, 0, $index);
$end = array_slice($array, $index);
$start[] = $new_element;
return array_merge($start, $end);
}
换句话说, $array1
应该根据$poss
进行组织。 例如: $array1
'中的第一个元素应该位于结尾处的位置3,而'a'应该位于位置0处。我已经尝试了数百种方法,但是我无法弄清楚。
你可以尝试使用array_combine
// since keys are aligned with words you can combine into single array
$merged_array = array_combine($poss, $array1);
// then sort array by keys and your words are in correct position
ksort($merged_array);
// update $array1 with sorted values
$array1 = array_values($merged_array);
如果您将此程序设计为练习,那么我希望您有耐心和好运!
但是,如果您在生产中需要此代码,则最好使用PHP排序功能,而不要浪费时间。
使用array_combine()
创建一个具有$poss
作为键和$array1
作为值的新数组,然后使用ksort()
使用其键对该新数组进行排序:
$array1= array("d","c","b","e","a");
$poss = array (3 ,2 ,1 ,4 ,0);
$out1 = array_combine($poss, $array1);
ksort($out1);
print_r($out1);
使用函数array_multisort()
可以同时对$poss
和 $array1
进行排序。 array_multisort()
的第一个参数告诉顺序,其他数组的值遵循第一个数组中值的移动:
$array1= array("d","c","b","e","a");
$poss = array (3 ,2 ,1 ,4 ,0);
array_multisort($poss, $array1);
print_r($array1);
两种方法的输出:
Array
(
[0] => a
[1] => b
[2] => c
[3] => d
[4] => e
)
这样就可以获得正确索引的数组
$newarray = array();
foreach($poss as $key => $value)
$newarray[$value] = $array1[$key];
var_dump($newarray);
以正确的索引和顺序排列
$newarray = array();
for($i = 0; $i < count($poss); $i++) {
$newarray[] = $array1[array_search($i, $poss)];
}
var_dump($newarray);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.