1

現在、配列に属する服のサイズ配列 (SML XL XXL など) を並べ替えようとしています。私は次の関数を介してこれを行うことができます(この場所Php Array Sorting Clothing Sizes (XXS XS SML XL XXL) and Numbers on a Dynamic Array のおかげで):

function cmp($a, $b) {

        $sizes = array(
        "XXS" => 0,
        "XS" => 1,
        "S" => 2,
        "M" => 3,
        "L" => 4,
        "XL" => 5,
        "XXL" => 6
        );

        $asize = $sizes[$a];
        $bsize = $sizes[$b];

        if ($asize == $bsize) {
            return 0;
        }

        return ($asize > $bsize) ? 1 : -1;

    }

    usort($the_array, "cmp");

$the_array("S", "M", "XL") のような配列の場合、これはすべてうまくいきます。ただし、私の配列は次のようになります。

$the_array = array("S : price £10", "XXL : price £10", "M : price £10", "XS : price £10")

これは機能しません...理想的には「:」までの配列の最初の部分のみを調べる関数が必要です。そのようなことはありますか?

助けてくれてありがとう。

4

4 に答える 4

2

このソリューションは、各文字列の先頭でサイズ値を検索します。サイズが別のサイズのプレフィックスでない場合にのみ機能します。たとえば、「X」は「XL」のプレフィックスになります。データの特定の形式に依存しません。有効なサイズの文字列の最も早い出現を見つけます。

// Your comparison function:
function cmp($a, $b) {
  // Make the array static for performance.
  static $sizes = array('XXS', 'XS', 'S', 'M', 'L', 'XL', 'XXL');

  // Find the size of $a and $b (the first string for which strpos===0)
  $asize = 100; // Sort non-size strings after matching sizes.
  $apos = -1;
  $bsize = 100;
  $bpos = -1;
  foreach ($sizes AS $val => $str) {
    // It's important to use `===` because `==` will match on
    // FALSE, which is returns for no match.
    if (($pos = strpos($a, $str)) !== FALSE && ($apos < 0 || $pos < $apos)) {
      $asize = $val;
      $apos = $pos;
    }
    if (($pos = strpos($b, $str)) !== FALSE && ($bpos < 0 || $pos < $bpos)) {
      $bsize = $val;
      $bpos = $pos;
    }
  }

  return ($asize == $bsize ? 0 : ($asize > $bsize ? 1 : -1));
}

usort($the_array, 'cmp');
于 2012-11-01T13:17:53.070 に答える
0

コールバックを呼び出しusort()て利用するとexplode()、最初の部分で並べ替えることができます。

$sizes = array(
    "XXS" => 0,
    "XS" => 1,
    "S" => 2,
    "M" => 3,
    "L" => 4,
    "XL" => 5,
    "XXL" => 6
    );
$the_array = array("S : price £10", "XXL : price £10", "M : price £10", "XS : price £10");

// Anonymous function -- PHP 5.3+ only...
// Uses the $sizes array from the higher scope...
usort($the_array, function($a, $b) use ($sizes) {
  // Split each on space,colon,space
  list($asize, $aprice) = explode(' : ', $a);
  list($bsize, $bprice) = explode(' : ', $b);

  // Perform the usort comparison
  // which uses the sizes matched above as array keys to the $sizes array
  if ($sizes[$asize] == $sizes[$bsize]) {
    return 0;
  }
  return $sizes[$asize] < $sizes[$bsize] ? -1 : 1;
});

// Output:
var_dump($the_array);
array(4) {
  [0] =>
  string(15) "XS : price £10"
  [1] =>
  string(14) "S : price £10"
  [2] =>
  string(14) "M : price £10"
  [3] =>
  string(16) "XXL : price £10"
}

区切り文字が常に上記のとおりでなく、変化する場合は、の代わりにspace,colon,spaceを使用する必要があります。preg_split()explode()

// Split on any number of spaces surrounding the :
list($asize, $aprice) = preg_split('/\s*:\s*/', $a);
于 2012-11-01T12:52:23.777 に答える
0

配列をサイズでソートするだけの場合は、次のようにします。

/** THE SORT FUNCTION **/
function sortSize($data_arr)
{
    $sizes_arr = array('XXS' => 0, 'XS'  => 1, 'S'   => 2, 'M'   => 3, 'L'   => 4, 'XL'  => 5, 'XXL' => 6);

    $data_sort_arr = array();
    foreach ($data_arr as $value)
    {
        //get the size
        $size_item_arr = explode(':', $value);
        $size_item_str = trim($size_item_arr[0]);

        //get the position of size from sizes array
        $size_pos_int = intval($sizes_arr[$size_item_str]);

        //populate new array with sorted data
        $data_sort_arr[$size_pos_int] = $value;
    }

    //sort then reset keys numerically
    ksort($data_sort_arr);
    return array_values($data_sort_arr);
}
/** THE SORT FUNCTION **/

/** THE TEST **/
$data_arr = array("S : price £10", "XXL : price £10", "M : price £10", "XS : price £10");    
print_r(sortSize($data_arr));
/** THE TEST **/

次の結果が得られました。

Array
(
    [0] => XS : price £10
    [1] => S : price £10
    [2] => M : price £10
    [3] => XXL : price £10
)

私はこれがあなたが必要とするものであることを願っています?!

乾杯。

于 2012-11-01T13:53:27.107 に答える