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 排序,所以我假设我可以用第二个完成的计算覆盖第一个数组)

$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'键)索引一个数组:

$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

这将对您的数组进行排序。所以你可以对第二个数组进行排序。

<?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>";
?>

然后你可以使用 Alessandro Minoccheri 提到的逻辑。

$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

由于您没有共享具有最小值的第二个数组的排序方式(本身以及相对于最大值数组),我会说,通过 id 条目索引最小值,然后在第二次迭代中进行计算。它应该足够快,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

以下对我有用。不过,我不是 PHP 专家,即我对克隆不太熟悉(请注意空的克隆数组)。请注意,它只复制现有属性(如果一个数组确实包含 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 回答