Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 比较,;根据另一个数组对对象数组进行排序_Php_Arrays_Sorting - Fatal编程技术网

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)}
}