PHP array copy certain keys, built-in functions? Nested loop performance?

后端 未结 2 1366
孤独总比滥情好
孤独总比滥情好 2021-02-07 12:09

I have a PHP array that I\'d like to duplicate but only copy elements from the array whose keys appear in another array.

Here are my arrays:

$data[123] =         


        
相关标签:
2条回答
  • 2021-02-07 12:32

    Why not load the entire result set into an array, then begin processing with nested loops?

    $query_result = mysql_query($my_query) or die(mysql_error());
    $query_rows = mysql_num_rows($query_result);
    for ($i = 0; $i < $query_rows; $i++)
    {
        $row = mysql_fetch_assoc($query_result);
        // 'key' is the name of the column containing the data key (123)
        // 'value' is the name of the column containing the value (aaa)
        $data[$row['key']] = $row['value']; 
    }
    foreach ($data as $key => $value)
    {
        if ( in_array($key, $keys_to_copy)) 
        {
            $copied_data[$key] = $value;
        }
    }
    
    0 讨论(0)
  • 2021-02-07 12:44

    I worked it out - I almost had it above.I thought I'd post the answer anyway for completeness. Hope this helps someone out!

    array_intersect_key($data, array_flip($keys_to_copy))

    Use array_flip() to switch $keys_to_copy so it can be used within array_intersect_keys()

    I'll run some tests to compare performance between the manual loop above, to this answer. I would expect the built-in functions to be faster but they might be pretty equal. I know arrays are heavily optimised so I'm sure it will be close.

    EDIT:
    I have run some benchmarks using PHP CLI to compare the foreach() code in my question with the code in my answer above. The results are quite astounding.
    Here's the code I used to benchmark, which I think is valid:

    <?php
    ini_set('max_execution_time', 0);//NOT NEEDED FOR CLI
    
    // BUILD RANDOM DATA ARRAY
    $data = array();
    while ( count($data) <= 200000) {
        $data[rand(0, 500000)] = rand(0, 500000);
    }
    $keys_to_copy = array_rand($data, 100000);
    
    // FOREACH
    $timer_start = microtime(TRUE);
    foreach ($data as $key => $value) {
        if ( in_array($key, $keys_to_copy)) {
            $copied_data[$key] = $value;
        }
    }
    echo 'foreach: '.(microtime(TRUE) - $timer_start)."s\r\n";
    
    // BUILT-IN ARRAY FUNCTIONS
    $timer_start = microtime(TRUE);
    $copied_data = array_intersect_key($data, array_flip($keys_to_copy));
    echo 'built-in: '.(microtime(TRUE) - $timer_start)."s\r\n";
    ?>

    And the results...
    foreach: 662.217s
    array_intersect_key: 0.099s

    So it's much faster over loads of array elements to use the PHP array functions rather than foreach. I thought it would be faster but not by that much!

    0 讨论(0)
提交回复
热议问题