2

私はこのように見える2つの配列を持っています:

(これはvalue_maxで並べ替えられます)

$max_values = [
    ["name" => "john", "id" => 5, "value_max" => 500], 
    ["name" => "john", "id" => 3, "value_max" => 200], 
    ...
];

$min_values = [
    ["name" => "john", "id" => 5, "value_min" => 100], 
    ["name" => "john", "id" => 3, "value_min" => 150], 
    ...
];

そして、私はこのような最終的な配列を持っている必要があります:

(これはまだvalue_maxで並べ替える必要があるため、最初の配列を2番目の配列で行った計算で上書きできると思います)

$max_and_difference_values = [
    ["name" => "john", "id" => 5, "value_max" => 500, "difference_value" => 400],
    ["name" => "john", "id" => 3, "value_max" => 200, "difference_value" => 50 ], 
    ...
];

私の質問は非常に単純です。最初のアレイを実行し、最後のアレイを構築するための最良/効果的な方法は何ですか。配列のサイズが約150要素であると仮定します。

4

5 に答える 5

2

すべての配列を繰り返しループしないようにするには、マージするフィールド、つまり'id'キーで1つの配列にインデックスを付けます。

$second = array_combine(array_map(function ($i) { return $i['id']; }, $second_array), $second_array);

次に、もう一方をループして値を比較するのは非常に簡単です。

$third = array();
foreach ($first_array as $i) {
    $third[] = $i + array('difference_value' => $i['value_max'] - $second[$i['id']]['value_min']);
}

両方の配列が完全に一致するキーを持つことが保証されている場合は、最初の手順は必要なく、既存のキーを使用するだけです。

于 2012-10-24T07:28:11.573 に答える
0

最小値を持つ2番目の配列が(それ自体および最大値配列に対して)どのように順序付けられているかを共有していないため、idエントリで最小値にインデックスを付けてから、2回目の反復で計算を行います。それは十分に速いはずです、150の要素はただ「何もない」です:

$max_values = [
    ["name" => "john", "id" => 5, "value_max" => 500],
    ["name" => "john", "id" => 3, "value_max" => 200],
];

$min_values = [
    ["name" => "john", "id" => 5, "value_min" => 100],
    ["name" => "john", "id" => 3, "value_min" => 150],
];

$min_values_by_id = [];
foreach($min_values as $min) {
    $min_values_by_id[$min['id']] = $min['value_min'];
}

$max_and_difference_values = $max_values;
foreach($max_and_difference_values as &$entry)
{
    $entry['difference_value'] = $entry['value_max'] - $min_values_by_id[$entry['id']];
}
unset($entry);

print_r($max_and_difference_values);

これは単純な例であり、派手なものではありません。デモ

于 2012-10-24T07:59:31.633 に答える
0

これにより、配列が並べ替えられます。したがって、2番目の配列を並べ替えることができます。

<?php
$min_values = array(
    array("name" => "john", "id" => 5, "value_min" => 100), 
    array("name" => "john", "id" => 3, "value_min" => 150), 

);



function aasort (&$array, $key) {
    $sorter=array();
    $ret=array();
    reset($array);
    foreach ($array as $ii => $va) {
        $sorter[$ii]=$va[$key];
    }
    asort($sorter);
    foreach ($sorter as $ii => $va) {
        $ret[$ii]=$array[$ii];
    }
    $array=$ret;
}

aasort($min_values,"id");

echo "<pre>";
print_r($min_values);
echo "</pre>";
?>

そして、AlessandroMinoccheriが述べたロジックを使用できます。

$arr = array();
for ($i=0; $i<count($first_array);$i++){
$arr['name'] = $first_array[$i]['name'];
$arr['id'] = $first_array[$i]['id'];
$arr['value_max'] = $first_array[$i]['value_max'];
$arr['difference_value'] = $first_array[$i]['value_max']-$second[$i['id']]['value_max']    ; 
}
于 2012-10-24T07:56:30.317 に答える
0

以下は私のために働きます。ただし、私はPHPの専門家ではありません。つまり、クローン作成についてはあまり詳しくありません(空のクローン配列に注意してください)。既存のプロパティのみをコピーすることに注意してください(1つの配列にmin_valueが含まれ、別の配列に他のキーのみが含まれている場合)

本質的に

function convertArr( $arr ) {

    // Easy referencing without having to search through the arrays more than once for a matching id
    $new_arr = array();

    foreach( $arr as $array ) {

        $new_arr[ $array['id'] ] = cloneArr( $array );
    }

    return $new_arr;
}

function merge( $arr1, $arr2 ) {

    $convertedArr1 = convertArr( $arr1 );
    $convertedArr2 = convertArr( $arr2 );

    $arr = array();

    // Based on the ordered array
    foreach( $convertedArr1 as $array ) {

        $id = $array['id'];
        $tempArr = array();

        foreach( $convertedArr1[ $id ] as $k => $v ) {

            $tempArr[ $k ] = $v;
        }

        foreach( $convertedArr2[ $id ] as $k => $v ) {

            $tempArr[ $k ] = $v;
        }

        array_push( $arr, $tempArr );
    }

    return $arr;
}

完全な例:

<?php

    //$arr1 = [ ["name" => "john", "id" => 5, "value_max" => 500], ["name" => "john", "id" => 3, "value_max" => 200] ];
    //$arr2 = [ ["name" => "john", "id" => 5, "value_min" => 100], ["name" => "john", "id" => 3, "value_min" => 150] ];

    $arr1 = array(

        array( "name" => "john", "id" => 5, "value_max" => 500 ),
        array( "name" => "john", "id" => 3, "value_max" => 200 )

    );

    $arr2 = array(

        array( "name" => "john", "id" => 5, "value_min" => 100 ),
        array( "name" => "john", "id" => 3, "value_min" => 150 )
    );

    function neatPrint( $arr ) {

        echo "<pre>";
        print_r( $arr );
        echo "</pre>";
    }

    echo "<h2>Before</h2>";
    neatPrint( $arr1 );
    neatPrint( $arr2 );
    echo "<hr/>";

    function cloneArr( $old ) {

        // I dunno how to properly clone
        return $old;
    }

    function convertArr( $arr ) {

        // Easy referencing without having to search through the arrays more than once for a matching id
        $new_arr = array();

        foreach( $arr as $array ) {

            $new_arr[ $array['id'] ] = cloneArr( $array );
        }

        return $new_arr;
    }

    function merge( $arr1, $arr2 ) {

        $convertedArr1 = convertArr( $arr1 );
        $convertedArr2 = convertArr( $arr2 );

        $arr = array();

        // Based on the ordered array
        foreach( $convertedArr1 as $array ) {

            $id = $array['id'];
            $tempArr = array();

            neatPrint( $convertedArr1[ $id ] );
            neatPrint( $convertedArr2[ $id ] );

            foreach( $convertedArr1[ $id ] as $k => $v ) {

                $tempArr[ $k ] = $v;
            }

            foreach( $convertedArr2[ $id ] as $k => $v ) {

                $tempArr[ $k ] = $v;
            }

            array_push( $arr, $tempArr );
        }

        echo "<h2>Result</h2>";
        return $arr;
    }

    echo "<h2>Loopthrough</h2>";

    neatPrint( merge( $arr1, $arr2 ) );
?>

どう考えているか教えてください :-)

于 2012-10-24T08:06:40.573 に答える
-1

要素が正常である場合は、次のコードを試してください。

$arr = array();
for ($i=0; $i<count($first_array);$i++){
   $arr['name'] = $first_array[$i]['name'];
   $arr['id'] = $first_array[$i]['id'];
   $arr['value_max'] = $first_array[$i]['value_max'];
   $arr['difference_value'] = $first_array[$i]['value_max']-$second[$i['id']]['value_max'] ;
}
于 2012-10-24T07:29:49.967 に答える