2017-01-24 9 views
0

ここではちょっとした厄介な状況があります。私はPHPでオブジェクトの配列を持っているので、複数のプロパティでそれらをソートする必要があります。最終的な目標は、「中止」された項目が配列の最後にあるところでそれらをソートすることです。そして、配列全体がIDで行われます。したがって、1が中止されない限り、ID 1は2の前に来るでしょう。次に2が最初に来ます。ここでPHPでオブジェクトの配列を複数のプロパティで並べ替える

$prod = array(
    1 => Product Object (
     [id] => 1 
     [title] => "A product" 
     [is_discontinued] => 1 
    ) 
    2 => Product Object (
     [id] => 2 
     [title] => 'Another Product' 
     [is_discontinued] => 0 
    ) 
    3 => Product Object (
     [id] => 3 
     [title] => 'Yet another one' 
     [is_discontinued] => 0 
    ) 
    ... 
) 

私のオリジナルのアイデアは、PHPで「usort」機能に組み込まれて使用することでしたが、それはそれを作ったとして、IDが後方だったので、それがうまくいかなかった...私のデータの一例です。ここでは、..私がやった仕事をして2、その後、中止製品のすべては、配列の末尾に今あったが、今3が最初に表示されますので、それはIDの順序を逆に

$prod = usort($prod, function($a) { 
    return ($a->is_discontinued) ? 1 : -1; 
}); 

です私はそれが2、次に3、そして1とリストされるようにそれが必要です。2は中断されていないIDの中で最も低いIDなので、非中断の最も低いIDです。

私は理解したいと思っています。必要に応じてもっと多くのコードを提供することができます。私は本当にこれを理解する必要があります。事前にお手伝いいただきありがとうございます、本当に感謝しています。

問題は、1つの単一の値に基づいてオブジェクトの配列をソートしていたので、私の質問は重複としてマークされていません。これは私がすでに試したソリューションを使用することで簡単にやり遂げることができますが、キーと別のキーでソートする必要があります。

+1

それは厄介かもしれません、しかし、利用可能な/ディスコの配列を2つの別々のものに分割することができますntinued、[ksort()](https://secure.php.net/manual/en/function.ksort.php)それらを結合して戻します。これはあなたが最初に彼らの鍵で注文された後、彼らの鍵で注文されることを中止する必要があります。 – Jake

+1

'array_filter()'を使って、 'is_discontinued'を' true'/'1'として削除して、残りのループが簡単になるようにすることができます。しかし、これは一時的に[type juggle](http://php.net/manual/en/language.types.type-juggling.php)オブジェクトを持っていることを意味します。 – Xorifelse

+0

@ジェイク私はそれをしなければならないかもしれない。私はそれを分割しないようにしようとしていましたが、1つの配列に対して4つまたは5つのforeachループを持つのが嫌いです。私が試したことは、2つではなく1つのプロパティに基づいてソートすることしかできません。 –

答えて

1

次の2つの配列をフィルタリングし、それらに

$prod = array(
    1 => array (
     'id' => 1, 
     'title' => "A product", 
     'is_discontinued' => 1, 
    ), 
    2 => array (
     'id' => 2, 
     'title' => 'Another Product', 
     'is_discontinued' => 0, 
    ), 
    3 => array (
     'id' => 3, 
     'title' => 'Yet another one', 
     'is_discontinued' => 0 
    ) 

); 

$discontinued = array_filter($prod, function($elem) { 
    return $elem['is_discontinued'] ==1; 
}); 

$continued = array_filter($prod, function($elem) { 
    return $elem['is_discontinued'] ==0; 
}); 

echo "<pre>"; 
$new_array=array_merge($continued,$discontinued); 
print_r($new_array); 
+0

それはうまくいくように見えて、サーバー上ではあまりにも厳しくはありません。私の主な関心事は、私は650以上のオブジェクトの配列を扱っており、処理をあまりにも強くしてページを遅らせることは望まないが、このメソッドはオーバーヘッドがあまりありません。ありがとうございました。 –

+0

ジャグリングの種類がありません。それ以外の場合は、 'property_exists()'を使用します。 – Xorifelse

1

をマージすることができますあなたはまだ:)

<?php 
$array = [ 
    (object) ['id' => 1, 'title' => 'A product', 'is_discontinued' => 1], 
    (object) ['id' => 4, 'title' => 'C product', 'is_discontinued' => 0], 
    (object) ['id' => 3, 'title' => 'B product', 'is_discontinued' => 1], 
    (object) ['id' => 2, 'title' => 'X product', 'is_discontinued' => 0], 
    (object) ['id' => 5, 'title' => 'W product', 'is_discontinued' => 0] 
]; 
print_r($array); 

$prod = usort($array, function($a, $b) { 
    $c = $a->is_discontinued - $b->is_discontinued; 
    $c .= $a->id - $b->id; 
    return $c; 
}); 

print_r($array); 

の作業例をusort使用することができます。 http://sandbox.onlinephpfunctions.com/code/549f1d5a1afcf983ad34303b80af0968927a62df

関連する問題