2B dizi sütunlar halinde birden 1D diziler dönüm en etkili yöntem

2 Cevap php

Ben bugün bir for döngü önce yazdığım gibi, ben ... bunu yapmanın bir yolu var kıvrımlara olması gerektiğini düşündüm bu yüzden ben sorardım düşündüm. Ben bir yinelenen soru için kısaca baktım ama belirgin bir şey görmedim.

The Problem:

Uzunluğu M N dizileri göz önüne alındığında, N-sütun 2B dizi ile bir M-satır bunları açmak

Example:

$id   = [1,5,2,8,6]
$name = [a,b,c,d,e]
$result = [[1,a],
           [5,b],
           [2,c],
           [8,d],
           [6,e]]

My Solution:

Oldukça yalındır ve muhtemelen optimal değil, ama çalışır:

<?php
// $row is returned from a DB query
// $row['<var>'] is a comma separated string of values
$categories = array();
$ids = explode(",", $row['ids']);
$names = explode(",", $row['names']);
$titles = explode(",", $row['titles']);
for($i = 0; $i < count($ids); $i++) {
    $categories[] = array("id" => $ids[$i],
                          "name" => $names[$i],
                          "title" => $titles[$i]);
}
?>

Not: Ben spec isim => değer biraz koymadı, aynı zamanda o tutmak için bazı yolu var olsaydı harika olurdu.

2 Cevap

Belki bu? Daha verimli ama kesinlikle temiz değil emin eğer.

/*
Using the below data:

$row['ids'] = '1,2,3';
$row['names'] = 'a,b,c';
$row['titles'] = 'title1,title2,title3';
*/

$categories = array_map(NULL,
  explode(',', $row['ids']),
  explode(',', $row['names']),
  explode(',', $row['titles'])
);

// If you must retain keys then use instead:
$withKeys = array();

foreach ($row as $k => $v) {
    $v = explode(',', $v);

    foreach ($v as $k2 => $v2) {
        $withKeys[$k2][$k] = $v[$k2];
    }
}

print_r($categories);
print_r($withKeys);

/*
$categories:

array
  0 => 
    array
      0 => int 1
      1 => string 'a' (length=1)
      2 => string 'title1' (length=6)
...

$withKeys:

array
  0 =>
    array
      'ids' => int 1
      'names' => string 'a' (length=1)
      'titles' => string 'title1' (length=6)
...
*/

Sadece bu sayfadaki 4 sonuçlar için hızlı, basit kriter yaptım ve şu var:

// Using the following data set:
$row = array(
    'ids'       =>  '1,2,3,4,5',
    'names'     =>  'abc,def,ghi,jkl,mno',
    'titles'    =>  'pqrs,tuvw,xyzA,BCDE,FGHI'
);

/*
For 10,000 iterations,

Merge, for:
0.52803611755371

Merge, func:
0.94854116439819

Merge, array_map:
0.30260396003723

Merge, foreach:
0.40261697769165
*/

Evet, array_combine()

$result = array_combine( $id, $name );

EDIT

İşte senin veri dönüşümü halledeceğini nasıl

function convertRow( $row )
{
  $length = null;
  $keys = array();

  foreach ( $row as $key => $value )
  {
    $row[$key] = explode( ',', $value );
    if ( !is_null( $length ) && $length != count( $row[$key] ) )
    {
      throw new Exception( 'Lengths don not match' );
    }
    $length = count( $row[$key] );

    // Cheap way to produce a singular - might break on some words
    $keys[$key] = preg_replace( "/s$/", '', $key );
  }

  $output = array();

  for ( $i = 0; $i < $length; $i++ )
  {
    foreach ( $keys as $key => $singular )
    {
      $output[$i][$singular] = $row[$key][$i];
    }
  }

  return $output;
}

Ve bir test

$row = convertRow( $row );
echo '<pre>';
print_r( $row );