【问题标题】:Sort array elements based on another array's keys根据另一个数组的键对数组元素进行排序
【发布时间】:2018-02-09 17:32:06
【问题描述】:

在我的 PHP 文件中,我有 2 个数组,每个数组中的键都从 0 到最后一个索引编号,它们都包含相同的数组元素编号,因为它们包含同一联系人的数据,但每个数组都包含同一联系人的不同数据,每个联系人都有一个 ID,这是他在数组中的索引。

我已经根据值对第一个数组进行了降序排序,因此键的排序不同,值是降序的。我想以相同的方式对第二个数组进行排序,以便它们具有相同的键顺序,然后对两个数组执行array_values,以便它具有新的升序键顺序。

例如我有这两个数组:

$arr1 = array('0' => 'John', '1' => 'George', '2' => 'James', '3' => 'Harry');
$arr2 = array('0' => '12', '1' => '8', '2' => '34', '3' => '23');

我已经按照他的值对$arr2进行了降序排序,如下所示:

arsort($arr2);
// So now, $arr2 is "[2] => '34', [3] => '23', [0] => '12', [1] => '8'"

我想以同样的方式对$arr1 进行排序,所以它也是:

$arr1 = array('2' => '34', [3] => '23', [0] => '12', [1] => '8');

如何才能使数组按相同的键顺序排序?

【问题讨论】:

  • 为什么这个相关数据在两个单独的数组中?
  • 有点不清楚你想要的结果是什么。你说你想要$arr1 = array('2' => '34', [3] => '23', [0] => '12', [1] => '8');,但我认为事实并非如此
  • @PatrickQ 我认为他的意思是array(4) { [2]=> string(5) "James" [3]=> string(5) "Harry" [0]=> string(4) "John" [1]=> string(6) "George" },他没有更改值。
  • @ishegg 我也这么认为,但我不想假设/猜测

标签: php arrays string sorting key


【解决方案1】:

这个怎么样?使用array_replace()

<?php
$arr1 = array('0' => 'John', '1' => 'George', '2' => 'James', '3' => 'Harry');
$arr2 = array('0' => '12', '1' => '8', '2' => '34', '3' => '23');
arsort($arr2);
var_dump(array_replace($arr2, $arr1)); // array(4) { [2]=> string(5) "James" [3]=> string(5) "Harry" [0]=> string(4) "John" [1]=> string(6) "George" }

Demo

【讨论】:

    【解决方案2】:

    使用array_multi_sort()怎么样?它重新排列所有数组以匹配第一个排序数组的顺序。

    // as elements of $arr2 are shifted, corresponding elements of $arr1 will have the same shift
    array_multisort($arr2, SORT_DESC, $arr1);
    

    Live demo

    【讨论】:

      【解决方案3】:

      所以你有两个数组,那么为什么不循环第二个数组并使用它作为键顺序来使用第一个数组中的值创建一个新数组..

      $newArray = array();
      
      foreach (array_keys($arr2) as $key) {
          $newArray[$key] = $arr1[$key];
      }
      // then apply sorting to new array
      arsort($newArray);
      

      然后简单地打印你的新数组$newArray 来检查你的结果。

      print_r($newArray)var_dump($newArray)

      预期输出将是:

      array(4) {
        [0]=>
        string(4) "John"
        [2]=>
        string(5) "James"
        [3]=>
        string(5) "Harry"
        [1]=>
        string(6) "George"
      }
      

      同样,如果你想要一个相反的,然后改变只是用 $arr1 替换 $arr2 一样明智。

      $newArray = array();
      
      foreach (array_keys($arr1) as $key) {
          $newArray[$key] = $arr2[$key];
      }
      // then apply sorting to new array
      arsort($newArray);
      var_dump($newArray)`
      

      预期输出将是:

      array(4) {
        [2]=>
        string(2) "34"
        [3]=>
        string(2) "23"
        [0]=>
        string(2) "12"
        [1]=>
        string(1) "8"
      }
      

      【讨论】:

        猜你喜欢
        • 2012-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多