0

私はphpで多次元配列を使用するのは初めてです。混乱したため、それらから離れようとしましたが、今ではそれらを有効に活用する時が来ました。私はそれらがどのように機能するかを理解しようとしてきましたが、理解できていません。

私がやろうとしているのは、文字列比較関数に基づいて結果を入力することです。「アイテム名」との一致が見つかったら、最初のスロットに「アイテム名」を含めてから、優先度を上げたいと思います1ずつスロット。

したがって、配列への入力がすべて完了すると、さまざまな会社名が付けられ、それぞれに優先順位が付けられます...

次の配列を宣言して操作する方法がわかりません。

$matches = array(
    'name'=>array('somename'),
    'priority'=>array($priority_level++)
);
4

6 に答える 6

1

この場合、これも一次元配列で解決できるでしょうか?

$matches    = array(
        'company_1' => 0,
        'company_2' => 0,
);

if (isset($matches['company_1'])) {
    ++$matches['company_1'];
} else {
    $matches['company_1'] = 1;
}

名前がすでにリストにあるかどうかを調べます。そうでない場合は、array_keyこの値に を設定します。既存の値が見つかった場合は、「優先度」を上げるだけです。

于 2012-07-12T18:54:31.197 に答える
1

多次元配列は簡単です。それらはすべて配列であり、要素は他の配列です。

したがって、2 つの別個の配列を持つことができます。

$name = array('somename');
$priority = array(1);

または、これら 2 つの配列を要素として持つ配列を作成することもできます。

$matches = array(
    'name' => array('somename'),
    'priority' => array(1)
);

したがって、 using$matches['name']は using と同じ$nameです。どちらも配列であり、格納方法が異なるだけです。

echo $name[0]; //'somename';
echo $matches['name'][0]; //'somename';

したがって、$matches配列に別の名前を追加するには、次のようにします。

$matches['name'][] = 'Another Name';
$matches['priority'][] = 2;

print_r($matches);出力します:

Array
(
    [name] => Array
        (
            [0] => somename
            [1] => Another Name
        )

    [priority] => Array
        (
            [0] => 1
            [1] => 2
        )

)
于 2012-07-12T18:49:02.217 に答える
1

したがって、あなたが持っているものでは、変数 $matches はキー付き配列を指し、その配列の 'name' 要素は 1 つのエントリ 'somename' を持つインデックス付き配列になり、値を持つ 'priority' エントリが存在します。 1 つのエントリ = $priority_level を持つインデックス付き配列です。

代わりに、おそらくあなたが望むのは次のようなものだと思います:

$matches[] = array(name => 'somename', $priority => $priority_level++);

そうすれば、 $matches はインデックス付き配列であり、各インデックスはキー付き配列を保持するため、次のようにアドレス指定できます。

$matches[0]['name']$matches[0]['priority']、ほとんどの人にとってより論理的です。

于 2012-07-12T18:49:20.970 に答える
1

私の意見では、より簡単に操作できる構造は、次のようなものになります。

$matches = array(
    array( 'name' => 'somename', 'priority' => $priority_level_for_this_match ),
    array( 'name' => 'someothername', 'priority' => $priority_level_for_that_match )
)

この配列を埋めるには、空の配列を作成することから始めます。

$matches = array();

次に、すべての一致を見つけます。

$match = array( 'name' => 'somename', 'priority' => $some_priority );

その配列をマッチに追加するには、最後にそれを叩くだけです:

$matches[] = $match;

いっぱいになったら、簡単に反復できます。

foreach($matches as $k => $v) {
    // The value in this case is also an array, and can be indexed as such
    echo( $v['name'] . ': ' . $v['priority'] . '<br>' );
}

一致した配列を優先度に従ってソートすることもできます。

function cmp($a, $b) {
    if($a['priority'] == $b['priority'])
        return 0;
    return ($a['priority'] < $b['priority']) ? -1 : 1;
}
usort($matches, 'cmp');

この回答から引用)

于 2012-07-12T18:51:38.933 に答える
0
$matches['name'][0]   --> 'somename'
$matches['priority'][0]  ---> the incremented $priority_level value
于 2012-07-12T18:47:20.353 に答える
0

質問に対するコメントで David が言ったように、仕事に適切なツールを使用していないようです。試す:

$priorities = array();
foreach($companies as $company) {
    if (!isset($priorities[$company])) { $priorities[$company] = 0; }
    $priorities[$company]++;
}

次に、 をチェックして優先順位にアクセスできます$priorities['SomeCompanyName'];

于 2012-07-12T18:50:53.783 に答える