3

連想配列の配列があります

aa[] = ('タイヤ'=>100, 'オイル'=>10, 'スパークプラグ'=>4 );
aa[] = ('タイヤ'=>454, 'オイル'=>43, 'スパークプラグ'=>3 );
aa[] = ('タイヤ'=>34, 'オイル'=>55, 'スパークプラグ'=>44 );
aa[] = ('タイヤ'=>454, 'オイル'=>43, 'スパークプラグ'=>45 );
aa[] = ('タイヤ'=>34, 'オイル'=>55, 'スパークプラグ'=>433 );
aa[] = ('タイヤ'=>23, 'オイル'=>33, 'スパークプラグ'=>44 );

2 つの質問

  1. カスタムコンパレータとして機能するコールバックを提供できるarray_uniqueはありますか?

  2. カスタムフィールド「スパークプラグ」でソートするにはどうすればよいですか

4

5 に答える 5

1

通常の重複チェックを手動で行う代わりに、これを行いました


$aa2 = 配列()

foeach($aa as $key => $value) {
  $aa2[$value['Oil']] = $value;
}
$aa = $aa2;

その後、ソートはキーで行われました...

于 2009-07-16T19:58:03.690 に答える
1
  1. これを行うために使用できる関数を知りません。配列の値に対して foreach を実行し、一意性チェックを手動で行う必要があります。

  2. usort()関数を使用して、カスタム コンパレータを提供します。

于 2009-07-16T18:55:53.847 に答える
0

この方法で重複を削除する場合の問題は、部分的な一意性について話しているため、どの値が残っているかをどのように判断するかです。

以下のこのソリューションは、最初にインデックス順に表示されるようにします。正確にはエレガントではありませんが、機能します。

<?php

$aa = array();
$aa[] = array('Tires'=>100, 'Oil'=>10, 'Spark Plugs'=>4 );
$aa[] = array('Tires'=>454, 'Oil'=>43, 'Spark Plugs'=>3 );
$aa[] = array('Tires'=>34,  'Oil'=>55, 'Spark Plugs'=>44 );
$aa[] = array('Tires'=>454, 'Oil'=>43, 'Spark Plugs'=>45 );
$aa[] = array('Tires'=>34,  'Oil'=>55, 'Spark Plugs'=>433 );
$aa[] = array('Tires'=>23,  'Oil'=>33, 'Spark Plugs'=>44 );

echo '<pre>';
print_r( arrayUniqeBySubKey( $aa, 'Oil' ) );
echo '</pre>';

function arrayUniqeBySubKey( $array, $key )
{
  $indexAggregates = array();

  foreach ( $array as $idx => $subArray )
  {
    $indexAggregates[$subArray[$key]][] = $idx;
  }

  foreach ( $indexAggregates as $originalIndexes )
  {
    $numOriginals = count( $originalIndexes );
    if ( 1 == $numOriginals )
    {
      continue;
    }
    for ( $i = 1; $i < $numOriginals; $i++ )
    {
      unset( $array[$originalIndexes[$i]] );
    }
  }
  return $array;
}
于 2009-07-16T20:54:52.983 に答える
0

実際、データをフィルタリングするためにarray_filterを使用できます。

$bb = array_filter($aa, function($item) {
    static $tmp = array();

    if ($filter = !in_array($item['Oil'], $tmp)) {
        $tmp[] = $item['Oil'];
    }

    return $filter;
});

これは、関数内で静的変数を使用して、既に返された Oil を「記憶」します。$tmparray_filterの実行中にのみ使用されるため、これは機能します。たとえば、これを関数にラップして複数回呼び出すと、 array_filterに提供された関数の最初の呼び出しでは、 $tmpは常に空の配列になります。

2 番目のタスクである並べ替えは、usortとカスタム並べ替え関数を使用して実行できます。

usort($bb, function($a, $b) {
    return ($a['Spark Plugs'] > $b['Spark Plugs']
            ? 1
            : -1);
});
于 2011-10-14T00:34:46.093 に答える
0

質問 1 については、 array_filterが必要だと思います。

そして、Brian が言うように、2 番目の質問に答えてください。

于 2009-07-16T18:57:59.897 に答える