Php 比较,;根据另一个数组对对象数组进行排序
我目前有一个对象数组,如下所示:Php 比较,;根据另一个数组对对象数组进行排序,php,arrays,sorting,Php,Arrays,Sorting,我目前有一个对象数组,如下所示: $aa = new StdClass; $aa->name = 'aa'; $aa->index = 30; $bb = new StdClass; $bb->name = 'bb'; $bb->index = 30; $cc = new StdClass; $cc->name = 'cc'; $cc->index = 10; $dd = new StdClass; $dd->name = 'dd'; $dd->i
$aa = new StdClass;
$aa->name = 'aa';
$aa->index = 30;
$bb = new StdClass;
$bb->name = 'bb';
$bb->index = 30;
$cc = new StdClass;
$cc->name = 'cc';
$cc->index = 10;
$dd = new StdClass;
$dd->name = 'dd';
$dd->index = 20;
$ee = new StdClass;
$ee->name = 'ee';
$ee->index = 10;
我已将对象放入数组中进行排序:
$arr = [$aa, $bb, $cc, $dd];
我还有一个额外的数组,我想用于在索引处按顺序对对象进行排序,例如$aa->index
:
$map = [30, 20, 10, 10, 30];
预期结果将是:
[$aa, $dd, $cc, $ee, $bb]
$aa
和$bb
中的另一个未定义,它们不能重复,所有索引必须分配到某个位置
如果不使用
foreach()
循环,按$map
设置的顺序排列$arr
的最佳方式是什么 老实说,我不确定我是否正确理解了这个问题,但这里有一个尝试来解决你的问题:
$aa = new stdClass;
$aa->name = 'aa';
$aa->index = 30;
$bb = new stdClass;
$bb->name = 'bb';
$bb->index = 30;
$cc = new stdClass;
$cc->name = 'cc';
$cc->index = 10;
$dd = new stdClass;
$dd->name = 'dd';
$dd->index = 20;
$ee = new stdClass;
$ee->name = 'ee';
$ee->index = 10;
$arr = [$aa, $bb, $dd, $cc, $ee];
$map = [30, 30 , 10, 20];
function sort_ish($arr, $map)
{
$return = [];
while($element = array_shift($map))
{
foreach($arr as $key => $value)
{
if($element == $value->index)
{
$return[] = $value;
unset($arr[$key]);
break 1;
}
}
}
return $return;
}
print_r(sort_ish($arr, $map));
这将输出:
Array
(
[0] => stdClass Object
(
[name] => aa
[index] => 30
)
[1] => stdClass Object
(
[name] => bb
[index] => 30
)
[2] => stdClass Object
(
[name] => cc
[index] => 10
)
[3] => stdClass Object
(
[name] => dd
[index] => 20
)
)
真的,我不得不用foreach
另一方面,我对这个问题很感兴趣,即使我没有答对。感谢您,OP.从技术上讲,我没有调用
foreach()
循环,而是使用递归函数进行循环。您只需将对象数组($arr
)作为第一个参数传递给函数,将数组映射($mapArr
)作为第二个参数传递给函数mrSorty()
将从这里开始通过神奇的函数传递对象数组,如array\u search()
和ksort()
编辑:
严肃地说,如果你需要我详细说明,请告诉我 你如何决定第一个索引-
30
-是指对象$aa
还是$bb
?@JiriHrazdil,我假设给你一个例子-[$aa,$dd,$cc,$cc,$aa]
是正确的输出吗?不,应该是[$aa,$dd,$cc,$ee,$bb]或者类似的。No Repeats这不是重复,在本例中使用array_search将不起作用,因为引用$order(或本例中的$map)具有重复的值,原始数组中具有相同索引属性的所有对象都将逐个排序,而不管$order或$map中的位置如何。
$arr = [$aa, $bb, $cc, $dd, $ee];
$mapArr = [30, 20, 10, 10, 30];
function mrSorty($arr, $mapArr, $objCount=0) {
static $newArr;
if ((count($mapArr)) > 0 && $objCount < ($objCount+count($mapArr)) ) {
$obj = $arr[$objCount];
$key = array_search($obj->index, $mapArr);
$newArr[$key] = $obj;
unset($mapArr[$key]);
mrSorty($arr, $mapArr, ++$objCount);
}
ksort($newArr); //Sort the Array by Key
return $newArr;
}
$arrayReturn = mrSorty($arr, $mapArr); //Array of Objects & Array Map
var_dump($arrayReturn);
array(5) {
[0] => object(stdClass) #1 (2) { ["name"]= > string(2)"aa" ["index"] => int(30)}
[1] => object(stdClass) #4 (2) { ["name"]= > string(2) "dd" ["index"] => int(20)}
[2] => object(stdClass) #3 (2) { ["name"]= > string(2) "cc" ["index"] => int(10)}
[3] => object(stdClass) #5 (2) { ["name"]= > string(2) "ee" ["index"] => int(10)}
[4] => object(stdClass) #2 (2) { ["name"]= > string(2)"bb" ["index"] => int(30)}
}