【问题标题】:PHP - Order array associative by specific valuePHP - 按特定值关联的顺序数组
【发布时间】:2016-11-17 15:48:05
【问题描述】:

我正在寻找一种按特定值对关联数组进行排序的方法,我不确定是否可行。用array_multisort()usort()函数试了一下,怕是拿不到。

例子:

$array[] = array('id' => 74215, 'type' => 'BOX');
$array[] = array('id' => 76123, 'type' => 'UNT');
$array[] = array('id' => 71231, 'type' => '');
$array[] = array('id' => 79765, 'type' => 'UNT');
$array[] = array('id' => 77421, 'type' => 'BOX');

如果我想按 'BOX' 排序,那么数组将是:

Array (
    [0] => Array
       (
                    [id] => 77421
                    [type] => 'BOX'
       )
    [1] => Array
       (
                    [id] => 74215
                    [type] => 'BOX'
       )
    [2] => Array
       (
                    [id] => 76123
                    [type] => 'UNT'
       )
    .
    .
    .

我可以传递像“UNT”这样的其他字符串,然后按这样的顺序排序。 这可能吗??

【问题讨论】:

  • 显示您尝试过的内容。
  • "如果我想按 'BOX' 订购" 这不太合乎逻辑。您的意思是要通过type订购?
  • 对不起@kamalpal 我正在搜索我的代码,但我删除了它:(
  • 不,@FirstOne 我不想按类型排序,就像我说的那样,我想按里面的值排序,传递一个像 'BOX' 这样的字符串,然后排序所有项目,把首先是 BOX 值。这就是为什么我问这是否可能。对不起,如果我解释得不好,我的英语很生疏。

标签: php arrays sorting


【解决方案1】:

我假设您想按字符串匹配“排序”,首先是所有匹配该字符串的人,然后是所有不匹配的人。除非你有一个古老的 php 版本,否则这可以工作:

$sortvalue = 'BOX';
usort($array, function($a, $b) use ($sortvalue) {
         if($a['type'] == $sortvalue) return -1;
         elseif($b['type'] == $sortvalue) return 1;
         else return 0;
    });

这应该将任何“BOX”条目放在数组的前面。

如果要对所有其他人进行分组,而不是 return 0return $a['type'] < $b['type']

编辑:整合 kamal pal 的建议/更正

【讨论】:

【解决方案2】:

我不确定 PHP 是否有它自己的函数来执行此操作,但我自己编写,希望对您有所帮助:

function sortArray($array_x, $key)
{
    $added_indexes;
    $new_array;

    for($i=0;$i<count($array_x);$i++)
    {
        if($array_x[$i]['type']==$key){
            $new_array[]=$array_x[$i];
            $added_indexes[]=$i;
        }
    }

    for($i=0;$i<count($array_x);$i++)
    {
        if(!in_array($i,$added_indexes))
        {
            $new_array[]=$array_x[$i];
        }
    }

    return $new_array;
}

所以当你这样做时:

$array[] = array('id' => 74215, 'type' => 'BOX');
$array[] = array('id' => 76123, 'type' => 'UNT');
$array[] = array('id' => 71231, 'type' => '');
$array[] = array('id' => 79765, 'type' => 'UNT');
$array[] = array('id' => 77421, 'type' => 'BOX');

print_r(sortArray($array,"BOX"));

给出这个:

Array
(
    [0] => Array
        (
            [id] => 74215
            [type] => BOX
        )

    [1] => Array
        (
            [id] => 77421
            [type] => BOX
        )

    [2] => Array
        (
            [id] => 76123
            [type] => UNT
        )

    [3] => Array
        (
            [id] => 71231
            [type] => 
        )

    [4] => Array
        (
            [id] => 79765
            [type] => UNT
        )
)

【讨论】:

    【解决方案3】:

    是的,我正在考虑类似的解决方案:

    usort($array, function ($a, $b) {   
        return $a['type'] == 'BOX' ? -1 : ($b['type'] == 'BOX' ? 1 : 0);
    });
    

    【讨论】:

      猜你喜欢
      • 2014-10-24
      • 1970-01-01
      • 2020-06-03
      • 2015-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      相关资源
      最近更新 更多