PHP Array Ayrıştırma

3 Cevap php

Hey tüm, geri arama sonuçları olarak gelen büyük bir dizi var ve ben aşağıdakileri yapmak istiyorum:

Aynı aşağıdaki anahtarları / vals eklemek "spubid" ile dizi boyunca ve her kayıt için yürüyün: Bu durumda ana dizi üyesine "sfirst, smi, slast", $ a [0]. Yani sonuç [0] inceliğini $ bırakmak ama eklemek olacağını, gelen değerleri (hepsi aynı "spubid" beri) dizideki diğer üyelerden, sfirst smi ve slast. Ben anahtar değeri (1, 2, 3) ortak anahtar (sfirst1 => "J.", smi1 => "F", slast1 => "Kennedy") iyi olurdu ekleyerek düşünüyorum. Ben o "spubid" ile dizi () (unset) üyelerinin kalanını BIRAKMA istiyorum. İşte tüm kayıtları aynı "spubid" var sırt ve bu örnekte alıyorum dizinin basitleştirilmiş bir örnek:

Array ( 
  [0] => 
    Array ( 
      [spubid] => A00502 
      [sfirst] => J. 
      [smi] => A. 
      [slast] => Doe
  [1] => 
    Array ( 
      [spubid] => A00502 
      [sfirst] => J. 
      [smi] => F. 
      [slast] => Kennedy 
  [2] => 
    Array ( 
      [spubid] => A00502 
      [sfirst] => B. 
      [smi] => F. 
      [slast] => James 
  [3] => 
    Array ( 
      [spubid] => A00502
      [sfirst] => S. 
      [smi] => M. 
      [slast] => Williamson 
      )
    )

Yani özünde ben $ TUTUN istiyorum [0] ama bunun (sfirst $ anahtar, smi $ anahtar, slast $ anahtar) yeni anahtarlar => değerler eklemek ve TÜM üyeleri "sfirst, smi, slast" dan değerleri ekleme aynı "spubid" ile daha sonra tanımsız $ a [1] - [3].

Sadece benim IDEAL sonuç olacağını netleştirmek için:

Array ( 
  [0] => 
    Array ( 
      [spubid] => A00502 
      [sfirst] => J. 
      [smi] => A. 
      [slast] => Doe
      [sfirst1] => J.
      [smi1] => F. 
      [slast1] => Kennedy
      [sfirst2] => B. 
      [smi2] => F. 
      [slast2] => James 
      [sfirst3] => S. 
      [smi3] => M. 
      [slast3] => Williamson
    )
  )

Çoğu durumda ben "spubid" 'nin çok sayıda içerir ama yayınların% 99 bu yüzden rutin sonuçlarını temizlik ve ayrıştırma süreci çok yararlı olacak bir yazar daha var başlamak için çok daha büyük bir yelpazeye sahip olacak çok daha kolay görüntü için.

*** GÜNCELLEME

Benim örnek basitleştirilmesi üzerinde Ben şeyler belirsiz yapmış olabilir tarafından sanırım. Ben hem Chacha102 ait ve zombat tepkilerini seviyorum ama benim "ana dizi" sadece birincil anahtar olur sadece bir PubID, çok daha fazla içerir. Ben bu kaydın diğer bir çok veri korumak gerekir, o küçük bir kısmı şöyledir:

[spubid] => A00680 
[bactive] => t 
[bbatch_import] => t 
[bincomplete] => t 
[scitation_vis] => I,X 
[dentered] => 2009-08-03 12:34:14.82103 
[sentered_by] => pubs_batchadd.php 
[drev] => 2009-08-03 12:34:14.82103 
[srev_by] => pubs_batchadd.php 
[bpeer_reviewed] => t 
[sarticle] => A case study of bora-driven flow and density changes on the Adriatic shelf (January 1987)
.
.
.
.
.

Her arama sorgusu ile geri gelmek yaklaşık 40 sütun vardır. Aksine bu örnekler PubID ile yapmak gibi sert onları kodlama daha hem önerildiği gibi yine değişiklikler yaparken, bunları nasıl içerebilir. Yazarlar çok boyutun bir parçası olmak ile (önerilen her ikiniz gibi) bir çok-boyutlu bir dizi oluşturma gayet, öneri için size de teşekkürler.

**** GÜNCELLEME:

İşte, ben bir çözüm için üzerinde yerleşmiş ne çok basit ve iş güzel bitmiş olur. Yazarlar orada kırık bu yüzden bir çok boyutlu bir dizi oluştururken sonunda yok.

Basitleştirilmiş çözüm üzerinde:

$apubs_final = array();
$spubid = NULL;
$ipub = 0;

foreach($apubs as $arec)
{
  if($spubid != $arec['spubid'])
  {
    $ipub++;
    $apubs_final[$ipub] = $arec;
    // insert UNSET statements here for author data
    $iauthor = 0;
    $spubid = $arec['spubid'];
  }
  $iauthor++;
  $apubs_final[$ipub]['authors'][$iauthor]['sauthor_first'] = $arec['sfirst'];
}

Cevap herkese teşekkürler, senin yardım / çok takdir edilmektedir!

3 Cevap

// First, probably the more parsable way.
foreach($array as $key => $values)
{
    $end[$spuid] = $values;
    $spuid = $values['spuid']
    $end[$spuid]['authors'][] = array('sfirst' => $values['sfirst'],
    			          'smi' => $values['smi'],
    			           'slast' => $values['slast']);

}

Böyle bir dizi alacak olan

Array(
    [A00502] =>
         Array(
    	   [supid] => A00502
               .... other values .....
    	   [authors] =>
    	         Array(
    			[0]=>
    		          Array(
    				['sfirst'] => '',
    				['smi'] => '',
    				['slast'] => '')
    			)
    	)
)

Eğer ben birçok kişi gibi özellikleri için bunu gördüm nasıl yazarlar, foreach böylece bu dizi kullanır, çünkü bir sayfada bunu gösteren düşünüyorsanız, bu şekilde çok daha fazla ayrıştırma mümkün buluyorum.

Eğer gerçekten ideal biçimini istiyorum yoksa sonradan bu kullanın

$count = 0;
foreach ($end as $supid => $values)
{
    $other_end[$count] = $values;
    $other_end[$count]['spuid'] = $spuid;
    foreach($values['authors'] as $key => $author)
    {
    	if($key == 0)
    	{
    		$suffix = '';
    	}
    	else
    	{
    		$suffix = $key;
    	}
    	$other_end[$count]['sfirst'.$suffix] = $author['sfirst'];
    	$other_end[$count]['smi'.$suffix] = $author['smi'];
    	$other_end[$count]['slast'.$suffix] = $author['slast'];
    }

}

Yerine neden spubid anahtarlı bir dizi yapmak değil:

// assuming $array is your array:

$storage = array();
foreach($array as $entry) {
  $bid = $entry['spubid'];
  if (!isset($storage[$bid])) {
    // duplicate entry - taking the author out of it.
    $stortmp = $entry;
    unset($stortmp['sfirst'], $stortmp['smi'], $stortmp['slast']);
    // add an authors array
    $stortmp['authors'] = array();
    $storage[$bid] = $stortmp;
  }
  $author = array(
    'sfirst' => $entry['sfirst'], 
    'smi' => $entry['smi'], 
    'slast' => $entry['slast']);
  $storage[$bid]['authors'][] = $author;
}

Şimdi $ depolama dizisi gibi görünmelidir:

Array(
  "A00502" => Array(
    "spubid" => "A00502",
    "authors" => Array(
      [0] => 
        Array ( 
          [sfirst] => J. 
          [smi] => A. 
          [slast] => Doe
       [1] => 
         Array ( 
          [sfirst] => J. 
          [smi] => F. 
          [slast] => Kennedy

Ve bunları kolayca yazdırmak için yazarlar bir foreach yapabilirsiniz:

foreach ($storage as $pub) {
  echo 'Pub ID: '.$pub['spubid']."<br/>";
  foreach ($pub['authors'] as $author) {
    echo 'Author: '.$author['sfirst'].' '.$author['smi'].' '.$author['slast']."<br/>";
  }
}

Ve bir bonus olarak, erişebilirsiniz $storage['A00502'].

UPDATED FOR COMMENT

Bu dizi muhtemelen yazarlar tabloya yayınlar tablo JOIN içeren SQL sorgusu çeşit geliyor gibi görünüyor. Bu sonuç kümesi gerçekten gerek yok bir çok bilgiyi çoğaltmak yapıyor. Veritabanı birden fazla kez alınan aktarılan tüm yayın verileri / olması için hiçbir neden yoktur. : Onun görüntülemek için giden tüm kitapların bir sorgu almak için yeniden deneyin, sonra böyle bir şey yapar bir "yazar" sorgu var

SELECT * FROM authors WHERE spubid IN ('A00502', 'A00503', 'A00504');

Sonra görüntüleme amacıyla kullanmak için bu diziye dönüştürmek. Sizin veritabanı trafik düzeyleri size teşekkür edecek.

Belirttiğiniz gibi bu kod tam çalışması gerekir. Ben ana dizi tuşları ve spubid alt tuşlar arasındaki korelasyonu yapmak için geçici diziler bir çift kullanarak yaklaşım aldı.

/* assume $array is the main array */
$array = array(
    array('spubid' => 'A00502','sfirst'=>'J.','smi'=>'A.','slast'=>'Doe'),
    array('spubid' => 'A00502','sfirst'=>'J.','smi'=>'F.','slast'=>'Kennedy'),
    array('spubid' => 'A00502','sfirst'=>'B.','smi'=>'F.','slast'=>'James'),
    array('spubid' => 'BXXXXX','sfirst'=>'B.','smi'=>'F.','slast'=>'James'),
    array('spubid' => 'A00502','sfirst'=>'S.','smi'=>'M.','slast'=>'Williamson')
);

//track spubid positions in the main array
$keyPositions = array();
//keys to delete after array iteration
$keyDel = array();
//track how many spubkey increments you've made to the fields
$spubKeys = array();
//fields to copy between spubids
$copyFields = array('sfirst','smi','slast');

foreach($array as $key => $subarr)
{
    if (isset($subarr['spubid'])) {
    	if (isset($keyPositions[$subarr['spubid']])) {
    		//spubid already exists at a main array key, do the copy
    		$spubKey = ++$spubKeys[$subarr['spubid']];
    		foreach($copyFields as $f) {
    			$array[$keyPositions[$subarr['spubid']]][$f.$spubKey] = $subarr[$f];
    		}
    		$keyDel[] = $key;
    	}
    	else {
    		//First time encountering this spubid, mark the position
    		$keyPositions[$subarr['spubid']] = $key;
    		$spubKeys[$subarr['spubid']] = 0;
    	}
    }
}
if (count($keyDel)) {
    foreach($keyDel as $idx) unset($array[$idx]);
}

var_dump($array);