1

PHPには、この種の配列があります(大きな例では申し訳ありませんが、特定の種類です):

[0] => Array
    (
        [title] => 1
        [desc] => 2
    )
[1] => Array
    (
        [title] => 1
        [desc] => 3
    )
[2] => Array
    (
        [title] => 1
        [desc] => 2
        [content] => 10
    )
[3] => Array
    (
        [title] => 1
        [desc] => 2
        [content] => 11
    )
[4] => Array
    (
        [title] => 1
        [desc] => 3
        [content] => 9
    )
[5] => Array
    (
        [title] => 1
        [desc] => 2
        [content] => 10
        [tag] => 'foo'
    )
[6] => Array
    (
        [title] => 1
        [desc] => 2
        [content] => 10
        [tag] => 'bar'
    )

そして、私はこの出力が欲しいです:

[0] => Array
    (
        [title] => 1
        [desc] => 2
    )
[1] => Array
    (
        [title] => 1
        [desc] => 2
        [content] => 10
    )
[2] => Array
    (
        [title] => 1
        [desc] => 2
        [content] => 10
        [tag] => 'bar'
    )
[3] => Array
    (
        [title] => 1
        [desc] => 2
        [content] => 10
        [tag] => 'foo'
    )
[4] => Array
    (
        [title] => 1
        [desc] => 2
        [content] => 11
    )
[5] => Array
    (
        [title] => 1
        [desc] => 3
    )
[6] => Array
    (
        [title] => 1
        [desc] => 3
        [content] => 9
    )

そして残念ながら、array_multisort()キーの数が一定でない配列を並べ替えることはできません。すべての配列を無視するだけです...何か考えはありますか?

4

3 に答える 3

2

どの基準で注文するかは明確ではありませんが、使用usortして、比較を定義する関数を提供することができます。

于 2012-09-25T08:09:23.780 に答える
2

次のコードのように、特別なニーズにusort合わせて調整された関数を使用できます。cmp

usort($arr, "cmp");

function cmp($a, $b) {
    $array = array('title','desc','content','tag');
    foreach ($array as &$ar) {
        $ai = isset($a[$ar]);
        $bi = isset($b[$ar]);
        if ($ai && !$bi) {
            return 1;
        }
        if ($bi && !$ai) {
            return -1;
        }
        if (!$bi) {
            return 0;
        }
        if ($a[$ar] > $b[$ar]) {
            return 1;
        }
        if ($b[$ar] > $a[$ar]) {
            return -1;
        }
    }
    return 0;
}

それはあなたが望むことをするはずです。

于 2012-09-25T08:50:04.920 に答える
0

サンプルコードの並べ替えは次のとおりです。

function cmp ($a, $b) {
  if ($a['desc'] == $b['desc']) {
    if (!isset($a['content']) && !isset($b['content'])) {
      return 0;
    }
    else if (!isset($a['content'])) {
      return -1;
    }
    else if (!isset($b['content'])) {
      return 1;
    }
    else {
      if ($a['content'] == $b['content']) {
        if (!isset($a['tag'])) {
          return -1;
        }
        else if (!isset($b['tag'])) {
          return 1;
        }
        else {
          if ($a['tag'] == $b['tag']) {
            return 0;
          }
          else if ($a['tag'] < $b['tag']) {
            return -1;
          }
          else {
            return 1;
          }
        }
        return 0;
      }
      else if ($a['content'] < $b['content']) {
        return -1;
      }
      else {
        return 1;
      }
    }
    return 0;
  }
  else if ($a['desc'] < $b['desc']) {
    return -1;
  }
  else {
    return 1;
  }
}
usort($array, 'cmp');

@ Nelson、@ therefromhere、@xdazzに感謝しますusort():)

于 2012-09-25T09:17:41.363 に答える